163AC - ABC054C: One-stroke Path
ABC54-C (300 points)
問題
与えられた 頂点 辺の単純無向グラフについて, 頂点 を始点として全ての頂点を 度だけ訪れるパスを数え上げる.
方針
- DFSで列挙.
# input N, M = map(int, input().split()) G = [list(map(int, input().split())) for _ in range(M)] edges = [set() for _ in range(N)] for a, b in G: edges[a - 1].add(b - 1) edges[b - 1].add(a - 1) def dfs(start, edges, path): path.append(start) if len(path) == N: path.pop() return 1 ans = 0 for u in edges[start]: if u in path: continue ans += dfs(u, edges, path) path.pop() return ans print(dfs(0, edges, []))
162AC - ABC053C: X: Yet Another Die Game
ABC053-C (300 points)
問題
サイコロの好きな面が上になるように置き, 以下の操作を必要な回数行うとき, 点以上得るために必要な最小の操作回数を求める.
- 操作:サイコロを手前、奥、左、右のどれかの方向に90°だけ回転させる。その後、上を向いている面に書かれた数を として 点得る.
- 入力は全て整数.
方針
明らかに → → → → とするのがベスト.
# input x = int(input()) q, r = divmod(x, 11) if r > 6: ans = 2 * q + 2 elif r > 0: ans = 2 * q + 1 else: ans = 2 * q print(ans)
161AC - ABC103C: Modulo Summation
ABC103-C (300 points)
問題
個の正整数 が与えられるとき, 非負整数 に対して を以下のように定義する.
このとき, の最大値を求める.
- 入力は全て整数.
方針
- の第 項について考えると の最大値は .
- とすると, 各項が最大値を取るので, このとき も最大値.
# input N = int(input()) A = list(map(int, input().split())) ans = sum(A) - N print(ans)
156AC - ABC054B: Template Matching
ABC054-B (200 points)
問題
の行列 と の行列 が与えられたとき (), が に含まれるかどうかを判定する.
方針
- 総当たり.
import numpy as np # input N, M = map(int, input().split()) A = [list(input()) for _ in range(N)] B = [list(input()) for _ in range(M)] A_arr = np.array(A) B_arr = np.array(B) for i in range(N - M + 1): for j in range(N - M + 1): if np.array_equal(A_arr[i:i + M, j:j + M], B_arr): print('Yes') exit() print('No')
154AC - ABC055C: Scc Puzzle
ABC055-C (300 points)
問題
個の 's' と 個の 'c' を組み合わせて 'scc' という文字列をいくつ作れるか求める. ただし 'c' を 個組み合わせて 個の 's' を作れるものとする.
- 入力は全て整数
方針
- :'s' は全て使用可能 + 残った 'c' で 'scc' を作る.
- :使用できない 's' があるので, 'c' を全てそのまま使う.
import math # input N, M = map(int, input().split()) if 2 * N <= M: ans = N + math.floor((M - 2 * N) / 4) else: ans = math.floor(M / 2) print(ans)
153AC - ABC056C: Go Home
ABC056-C (300 points)
問題
時刻 に座標 からスタートして, 時刻 に 動くことができるとき, 座標 に到達できる最短時刻を求める.
- 入力は全て整数
方針
- ぐらいまで実験してみる.
- までに到達できる座標は まで.
- までの座標であれば時刻 までに到達可能.
- よって となる を求めればよい.
# input X = int(input()) i = 1 while 2 * X > i * (i + 1): i += 1 print(i)
147AC - ABC058C: Digits in Multiplication
ABC057-C (300 points)
問題
つの整数 に対して, を「 進表記における, の桁数と の桁数のうち大きい方」と定義する.
このとき, 整数 に対して, つの正の整数 が を満たすように動くとき, の最小値を求める.
- 入力は全て整数
方針
- となるとき( が平方数)がベスト, となるとき( が素数)が最悪.
- から始めて, 約数が見つかるまで を ずつ減らしていく.
import math # input N = int(input()) i = int(math.sqrt(N)) while i: if N % i == 0: print(len(str(N // i))) break else: i -= 1