atoder ABC 318 C - Blue Springの解説
・説明
まず、問題文の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)