atoder ABC 318 C - Blue Springの解説

atcoder.jp

・説明
 まず、問題文のFを降順にソートしても変わらないのでソートする。Fの初めからD個ずつの和がPを超えた回数が1 日周遊パスを使った回数になる。あとは、通常料金のものを1 日周遊パスを使った料金に加算すればよい。

n,d,p=map(int,input().split())
f=list(map(int,input().split()))

f.sort(reverse=True)  #降順にソート.

tmp=0   #fのd個までの値の和.
cnt=0   #何個、1 日周遊パスを使うか.
t=1    #fの初めから何回、d個見たか.
for i in range(n):
    if i==t*(d):
        
        #1 日周遊パスを使った方が得.
        if tmp>p:
            cnt+=1
        #pを超えなくなったら、以降、超えることはない
        else:
            break
        tmp=0
        t+=1

    tmp+=f[i]
    
    #i=t*dでなくても、最後はpを超えていたらカウントする。入力例3のように.
    if i==n-1:
        if tmp>p:
            cnt+=1

ans=cnt*p   #1 日周遊パスを使った分.

#通常の値段の場合.
for i in range(cnt*d,n):
    ans+=f[i]
print(ans)