Atcoder ABC212, 210 振り返り
A - Alloy【AC】
A+B>0という制約があるため,この条件式でもAC出来ます.
A, B = map(int, input().split()) if B == 0: print("Gold") elif A == 0: print("Silver") else: print("Alloy")
B - Weak Password【AC】
全ての文字について条件が当てはまったらWeakとなります.よって,始めWeakだと仮定しておいて,一つずつ文字を見ていき,条件に外れたらFalseとします.そうすれば,1つも条件に外れない=全ての文字で条件が当てはまる なのでWeakと言えます.
A = input() weak_same = True weak_cont = True for i in range(len(A)-1): if A[i] != A[i+1]: weak_same = False if int(A[i]) + 1 != int(A[i+1]) and not(A[i] == "9" and A[i+1] == "0"): weak_cont = False if weak_cont or weak_same: print("Weak") else: print("Strong")
C - Min Difference【AC】
A, Bについてソートしておき,iとjを順に増やしていきながらansを更新していきます.A_iとB_jについて,iとjどちらを+1すべきかについて,なるべくAとBの差を小さくなるように試す必要があるのでAとBで小さい方のインデックスを増やせば良いことが分かります.
N, M = map(int, input().split()) A = sorted([int(i) for i in input().split()]) B = sorted([int(i) for i in input().split()]) ans = 1<<60 i = 0 j = 0 while i < N and j < M: if abs(A[i] - B[j]) < ans: ans = abs(A[i] - B[j]) else: if A[i] > B[j]: j += 1 else: i += 1 print(ans)
D - Querying Multiset【AC】
最小値の取り出しはO(log N)で出来るヒープを使えば良いです.ただし,xの加算に気をつける必要があります.全ての要素に+xしていってはO(N)かかるので恐らく間に合いません.よって,要素に加算するのではなくxという変数を用意しておいて,そこに加算しておくことにします.そして,出力するときに+xとすれば,今までのクエリの加算分を纏めて加算することになります.ただし,この方法だとpushの時に不都合が生じます.本来なら加算するべき所を加算せずに処理を続けているので,途中で加算クエリがきたあと,pushクエリが来たとき,加算分が足されることなく大小比較が行われ,最小値の計算が間違った物になります.よってpushするときに,本来加算されているはずのxを引いておくことで,大小比較を適切に行うことが出来ます.
import heapq que = [] x = 0 for _ in range(int(input())): query = [int(i) for i in input().split()] if query[0] == 1: heapq.heappush(que, query[1]-x) elif query[0] == 2: x += query[1] else: print(heapq.heappop(que)+x)
A - Cabbages【AC】
言われたとおりにやります
N, A, X, Y = map(int, input().split()) print(min(N, A)*X + max(0, N-A)*Y)
B - Bouzu Mekuri【AC】
初めの1が偶数番目か奇数番目かで区別します.初めの1にしか興味が無いので,初めの1を見つけたらすぐbreakすることに気をつけます.
N = int(input()) S = input() for i in range(N): if S[i] == "1": if i % 2 != 0: print("Aoki") else: print("Takahashi") break
C - Colorful Candies【AC】
del dictは計算量O(1)であることを利用します.dict[i]=iの個数とし,dict[i]=0ならdel dict[i]とすることでdictの中から取り除きます.こうすることで,dictにある要素は全て1以上となり,len(dict)とすればkeyの数が返ってくるので,要素の種類数を求めることが出来ます.やってることはsetとほとんど同じですが,setはdelの操作ができないのでdictで代用しています.
N, K = map(int, input().split()) C = [int(i) for i in input().split()] dic = {} for i in range(K): dic.setdefault(C[i], 0) dic[C[i]] += 1 ans = len(dic) for i in range(K, N): dic[C[i-K]] -= 1 if dic[C[i-K]] == 0: del dic[C[i-K]] dic.setdefault(C[i], 0) dic[C[i]] += 1 ans = max(ans, len(dic)) print(ans)