AtCoder-ABC227 A - Last Card / B - KEYENCE building【Python解答例】
キーエンスプログラミングコンテスト2021-Nov. (AtCoder Beginner Contest 227)のA とB問題についてPythonの解答例を記事にしていきます。
KEYENCE Programming Contest 2021 (AtCoder Beginner Contest 227) - AtCoder
AtCoder Beginner Contest227 A - Last Card
問題文
1,2,…,N の番号のついた N 人の人に合計 K 枚のカードを配ります。
人 A から始めて 人 A,A+1,A+2,…,N,1,2,… の順に 1 枚ずつカードを配るとき、最後のカードは誰に配られるでしょうか?
厳密には、人 x(1≤x
制約
・1≤N,K≤1000
・1≤A≤N
・入力は全て整数
解答例
n, k, a = map(int,input().split()) ans = (k+a-1) % n if ans == 0: print(n) else: print(ans)
解説
N人の人に対してK枚のカードをA番目の人から一枚ずつ配るときに、何番目の人に最後のカードが配られるか答える問題です。
K + A - 1をNで割った余りが答えansになりますが、番号が0番の人はいないのでansが0ときはN番目の人が答えとなります。
この結果を出力すればOKでした。
AtCoder Beginner Contest227 B - KEYENCE building
問題文
1 から N の番号がついた N 人の人がいます。
人 i はキーエンス本社ビルの建築面積を S i 平方メートルであると予想しました。
キーエンス本社ビルは下図のような形をしています。ただし、a,b はある 正の整数 です。
つまり、キーエンス本社ビルの建築面積は 4ab+3a+3b 平方メートルと表されます。
N 人のうち、この情報のみによって、予想した面積が確実に誤りであるとわかる人数を求めてください。
制約
・1≤N≤20
・1≤S i ≤1000
・入力に含まれる値は全て整数である
解答例
n = int(input()) S = list(map(int, input().split())) ans = 0 for i in range(n): flag = False for a in range(1,S[i]): for b in range(1,S[i]): if 4*a*b + 3*a + 3*b == S[i]: flag = True if not flag: ans += 1 print(ans)
解説
Siを満たす正の整数a,bが存在するか全探索する問題です。
N人の予想をひとつずつ調べます。
aとbが存在する場合、その値はS[i]以下なので探索範囲はそこまでとします。
S[i]を満たす組み合わせがあればflagをTrueにして管理し、a,bの探索後もflagがFalseのままであればansに1を足しました。
ループを抜けたあとにansを出力すればACです。