問題はこちら
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):
result_str = re.sub(r'(.)\1+', r'\1', input_str)
return result_str
S = input()
S_duplicated = remove_consecutive_chars(S)
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)
for char in result_dict:
result_dict[char].append(0)
return result_dict
for i in range(H):
row = S[i]
prefix_sum = calc_prefix_sum(row)
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]
if n_x > 0:
pass
else:
min_action = min(min_action, n_dot)
t_S = list(map(''.join, zip(*S)))
for i in range(W):
row = t_S[i]
prefix_sum = calc_prefix_sum(row)
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]
if n_x > 0:
pass
else:
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):
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):
result_indices = [index for index, element in enumerate(lst) if element[n-1] == '1']
return result_indices
n_friends = math.ceil(math.log2(N))
print(n_friends)
result_list = ["0"*n_friends] + binary_representation(N,n_friends)
for i in range(1, n_friends+1):
drinked = find_indices_with_one(result_list, i)
print(len(drinked), end = " ")
print(*drinked)
answer = int(input(), 2)
if answer ==0:
answer = 2**n_friends
print(answer)
F