ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

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

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

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です。