ABC337 python Atcoderの記録

問題はこちら
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