マイナビプログラミングコンテスト2021(AtCoder Beginner Contest 201)

A〜Cに回答できました(ダメダメだったけど,レート上がりました).


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は,暗証番号iSで与えられたルールを満たしているかどうかを管理しています.

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')

E - Xor Distances


F - Insertion Sort