atcoder ABC 323 C - World Tour Finalsの説明
・説明
'o'の問題は再び使えないので、累積和とbisectだと無理。xのものを抽出して、それをmaxのものと引き算してマイナスになるまでやる。
・失敗例
def II(): return int(input()) def MI(): return map(int, input().split()) def LI(): return list(map(int, input().split())) def LS(): return list(map(str, input().split())) n,m=MI() a=LI() s=[input() for _ in range(n)] import bisect cnt=[i+1 for i in range(n)] #print(s) for i in range(n): for j in range(m): if s[i][j]=='o': cnt[i]+=a[j] a.sort(reverse=True) ruiseki=[0] for i in range(m): tmp=a[i]+ruiseki[i] ruiseki.append(tmp) ma=max(cnt) for i in range(n): if cnt[i]==ma: print(0) continue sa=abs(cnt[i]-ma) bir=bisect.bisect_right(ruiseki,sa) print(bir)
・AC例
def II(): return int(input()) def MI(): return map(int, input().split()) def LI(): return list(map(int, input().split())) def LS(): return list(map(str, input().split())) n,m=MI() a=LI() s=[input() for _ in range(n)] cnt=[i+1 for i in range(n)] #点数 flag=[[] for _ in range(n)] #xのものを入れる #'x'のものを抽出する。 for i in range(n): for j in range(m): if s[i][j]=='o': cnt[i]+=a[j] if s[i][j]=='x': flag[i].append(a[j]) ma=max(cnt) for i in range(n): if cnt[i]==ma: print(0) continue sa=abs(cnt[i]-ma) #これがマイナスになるまで'x'のものを引き算する。 flag[i].sort(reverse=True) ans=0 for f in flag[i]: if sa<0: break sa-=f ans+=1 print(ans)