問題はこちら
3完(バーチャル参加)
A
N = int(input()) x,y = [0,0] # 結果の集計 for i in range(N): xi, yi = list(map(int, input().split())) x += xi y += yi # 勝者の判断 result = "" if x > y : result = "Takahashi" elif x < y : result = "Aoki" else: result = "Draw" print(result)
B
import re def remove_consecutive_chars(input_str): # 正規表現を使って連続する文字を検出し、1つに置き換える result_str = re.sub(r'(.)\1+', r'\1', input_str) return result_str S = input() S_duplicated = remove_consecutive_chars(S) # print(S_duplicated) list_answer = ["ABC","BC","AC","AB","A","B","C"] if S_duplicated in list_answer: print("Yes") else: print("No")
C
リストAの要素から、インデックスを取得することで人の順番を追える。
N = int(input()) A = [0] + list(map(int, input().split())) dict_order = {} for i in range(N+1): dict_order[A[i]] = i # ind = -1 for _ in range(N): ind = dict_order[ind] print(str(ind), end = " ")
D
愚直に描いてTLE
累積和を使う発想がなかった
H, W, K = map(int, input().split()) S = [input() for _ in range(H)] min_action = float('inf') # 累積和を計算する関数 def calc_prefix_sum(s): """ input: 文字列 output:辞書(要素はリスト) sample: "o.xo.x"→{"o":[1,1,1,2,2,2], ".":[0,1,1,1,2,2], "x":[0,0,1,1,1,2]} """ # 辞書の初期化 result_dict = {char: [0] * len(s) for char in ["o", ".", "x"]} # 初期値の設定 for char in result_dict: result_dict[char][0] = int(s[0] == char) # 累積和の計算 for i in range(1, len(s)): for char in result_dict: result_dict[char][i] = result_dict[char][i - 1] + int(s[i] == char) # 末尾に0を追加する(インデックスがー1の時に0を返したいため) for char in result_dict: result_dict[char].append(0) return result_dict # 行ごとにチェック for i in range(H): row = S[i] # 累積和でo.xの数を計算する prefix_sum = calc_prefix_sum(row) # print(prefix_sum) for j in range(W - K + 1): n_o = prefix_sum["o"][j+K-1] - prefix_sum["o"][j-1] n_dot = prefix_sum["."][j+K-1] - prefix_sum["."][j-1] n_x = prefix_sum["x"][j+K-1] - prefix_sum["x"][j-1] # print(i, j, n_o, n_dot, n_x) if n_x > 0: # 文字の範囲内にxがあれば、min_actionは更新しない pass else: # xがなければ.の数をmin_actionとして更新する min_action = min(min_action, n_dot) # 転置して再度行ごとにチェックする t_S = list(map(''.join, zip(*S))) # print(t_S) # 行ごとにチェック for i in range(W): row = t_S[i] # 累積和でo.xの数を計算する prefix_sum = calc_prefix_sum(row) # print(prefix_sum) for j in range(H - K + 1): n_o = prefix_sum["o"][j+K-1] - prefix_sum["o"][j-1] n_dot = prefix_sum["."][j+K-1] - prefix_sum["."][j-1] n_x = prefix_sum["x"][j+K-1] - prefix_sum["x"][j-1] # print(i, j, n_o, n_dot, n_x) if n_x > 0: # 文字の範囲内にxがあれば、min_actionは更新しない pass else: # xがなければ.の数をmin_actionとして更新する min_action = min(min_action, n_dot) # 出力 if min_action == float('inf'): print(-1) else: print(min_action)
E
必要な友人はlog2(N)人(適当に拾ってきた考えt型のサイト
1000本の毒入りワインの論理パズル - 優雅に華麗に大胆に!(FGO攻略ブログ)
)。
ジュースの番号を2進数で表し、そのi桁目が1であるジュースをi番目の友人に飲んでもらう。
その結果を10進数に直すことで、どのジュースが悪いか特定できる。
あとはジュースの本数が2のべき乗であるときの処理を気を付ける
import math N = int(input()) def binary_representation(n, m): # 1~nをm桁の2進数で表すリストを返す関数 result = [] for i in range(1, n+1): binary_str = format(i, '0' + str(m) + 'b') if len(binary_str) <= m: result.append(binary_str) else: result.append("0"*m) return result def find_indices_with_one(lst, n): # 各2進数の上からN桁目を取得し、それが1であればインデックスを返す result_indices = [index for index, element in enumerate(lst) if element[n-1] == '1'] return result_indices n_friends = math.ceil(math.log2(N)) # 最小の友人数 # 飲料bin(i)の上からj桁目が1であれば、友人jはそのドリンクを飲む print(n_friends) # 最小の友人 # 飲料1~Nをn_friends桁の2進数で表す result_list = ["0"*n_friends] + binary_representation(N,n_friends) # print(result_list) # 飲むドリンクを返す for i in range(1, n_friends+1): drinked = find_indices_with_one(result_list, i) print(len(drinked), end = " ") print(*drinked) # print(*find_indices_with_one(result_list, 1)) # returnを受け取り2進数を10進数に直して出力 answer = int(input(), 2) if answer ==0: answer = 2**n_friends print(answer)
F