A〜Cに回答できました(ダメダメだったけど,レート上がりました).
- A - Tiny Arithmetic Sequence
- B - Do you know the second highest mountain?
- C - Secret Number
- D - Game in Momotetsu World
- E - Xor Distances
- F - Insertion Sort
A - Tiny Arithmetic Sequence
等差数列なら増加数列 or 減少数列ですが,一方が実現できれば他方も(並び方を逆にすることで)実現できます.よって,増加数列を仮定し,ソートしてA[1] - A[0] == A[2] - A[1]かどうかを確かめればよいです.
(公式解説:解法2)
B - Do you know the second highest mountain?
公式解説のようにソートしたいTを先に持ってくるか,keyを指定してソートします.N = int(input()) L = [] for _ in range(N): S, T = input().split() L.append([S, int(T)]) L.sort(key = lambda x: x[1], reverse=True) print(L[1][0])
C - Secret Number
公式解説(Editorial - Mynavi Programming Contest 2021(AtCoder Beginner Contest 201))について:flag
は,今見ている暗証番号i
に0〜9の数字が含まれているかどうかを管理しています.
flag2
は,暗証番号i
がS
で与えられたルールを満たしているかどうかを管理しています.
ans += flag2
では,「bool型TrueとFalseは1, 0と等価」であることを利用しています.
【参考】Pythonの真偽値bool型(True, False)と他の型との変換・判定 | note.nkmk.me
cを必須リスト,qを?かつxでないものリストとして愚直に書き下しました.単に全通り見ればよかったのか...
S = list(input()) c = [] q = {i for i in range(10)} for i in range(10): if S[i] == 'o': c.append(i) q.remove(i) elif S[i] == 'x': q.remove(i) c = len(c) q = len(q) if c==4: print(4*3*2) elif c==3: print(4*3*2*q + 36) elif c==2: print(4*3*(q**2) + 24*q + 6 + 8) elif c==1: print(4*(q**3) + 6*(q**2) + 4*q + 1) elif c==0: print(q**4) else: print(0)
D - Game in Momotetsu World
動的計画法で「dp[i][j]=i,jマスでの二人の得点の差の最小値」としてdp[0][0]から考えており,考え方自体が間違っていました.最終結果の方から考えなくてはいけません.【公式解説】Editorial - Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)
【参考コード】Submission #22583124 - Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)
(「dp[i][j] = (i,j)から自分スタートでゲーム終了までプレイしたときの,自分-相手の最大値」とすると,「dp[i][j] = max(下移動の自分-相手, 右移動の自分-相手)」です.手番が変わると自分と相手が入れ替わるので,手番が変わったときにはdpの符号を変えればその手番での自分-相手になります.)
公式解説のように,「 高橋君の得点 - 青木君の得点 」とすると,maxとminが混在するので,初期化や手番管理が面倒でした.
(手番管理の点はマイナビプログラミングコンテスト2021(AtCoder Beginner Contest 201) - YouTubeでも言及されていました(36:23あたり)).
H, W = map(int, input().split()) A = [list(input()) for _ in range(H)] A = [[1 if A[i][j]=='+' else -1 for j in range(W)] for i in range(H)] dp = [[float('inf') if (i+j)%2 else -float('inf') for j in range(W)] for i in range(H)] dp[H - 1][W - 1] = 0 for i in reversed(range(H)): for j in reversed(range(W)): if (i + j) % 2: # Aoki のターン if i < H - 1: dp[i][j] = min(dp[i][j], - A[i + 1][j] + dp[i + 1][j]) if j < W - 1: dp[i][j] = min(dp[i][j], - A[i][j + 1] + dp[i][j + 1]) else: # Takahashi のターン if i < H - 1: dp[i][j] = max(dp[i][j], A[i + 1][j] + dp[i + 1][j]) if j < W - 1: dp[i][j] = max(dp[i][j], A[i][j + 1] + dp[i][j + 1]) if dp[0][0] > 0: print('Takahashi') elif dp[0][0] < 0: print('Aoki') elif dp[0][0] == 0: print('Draw')