キーエンスプログラミングコンテスト2021-Nov. (ABC227)参戦記

プログラミング

キーエンスさん主催のABC227の参加記録です。
レートは600台、使用言語はPython3の私が、AからCまでのACコード付きで自分が理解した内容で記録します。

A – Last Card

標準入出力と周期性の理解が問われる問題。

A問題の中では難しい問題だと思います。

周期性については、mod(割り算での余り)を考えると良いですね。
割り切れる時の場合分けをすればOKですね。

# キーエンスプログラミングコンテスト2021-Nov. (AtCoder Beginner Contest 227)
# A - Last Card

N, K, A = map(int,input().split())

ans = (A+K-1) % N

if ans == 0:
    print(N)
else:
    print(ans)

以下のように、0-indexで考えて、答えを出力するときに、1-indexに戻す事で、場合分けが不要になりますが、コンテスト中に自信をもって書けるか。となると、私にはまだ難しいです。

N, K, A = map(int,input().split())
print((((A-1)+K-1)%N)+1)

B – KEYENCE building

繰り返し処理と、set の扱いが問われる問題。

まずは、Sとしてあり得る範囲の a, b の組を全部列挙して、Sとしてあり得る値の候補を用意します。
その後に、各自の予想のSが、その候補に入っていない場合、答え用の変数を増やしていけばOKですね。

先に、あり得る値の候補を用意して、setに格納しておく。というのは、初めのうちは私には思いつきもしない方法でした。

# キーエンスプログラミングコンテスト2021-Nov. (AtCoder Beginner Contest 227)
# B - KEYENCE building


N = int(input())
S = list(map(int,input().split()))

potential = set()

for a in range (1,300):
    for b in range (1,300):
        area =  4*a*b + 3*a +3*b
        potential.add(area)
        if area > 1000:
            break

ans = 0
for s in S:
    if s not in potential:
        ans += 1

print(ans)

次のコードのように、Sの各要素を都度確認してもACは出来ますが、二重ループから抜け出す方法について知っておかないと難しいかもしれません。
また、答え用の変数の準備も異なるものを用意しました。(あり得る面積を答えた人をカウントしていき、最終的には、全体の人数からカウントした人を引いた数を出力。)

N = int(input())
S = list(map(int,input().split()))

mayberight=0 # あり得る面積を答えた人数

for s in S:
    for a in range (1,300):
        for b in range (1,300):
            if 4*a*b + 3*a + 3*b == s:
                mayberight += 1 # あり得る面積の場合、加算する
                break
        else:
            continue
        break

print(N - mayberight) # 間違っている人数なので、全体からあり得る面積を答えた人数を引く

C – ABC conjecture

全探索の問題。

私はコンテスト中に解けませんでした。全探索の途中の break の入れ忘れでした。

問題文から、A≦B≦Cとあるので、A=B=Cの時、つまり、A*A*Aの時にNを超える時にbreakすること、同様に、(A<)B=Cの時、A*B*Bの時にNを超える時にbreakすることをコードに書けばpypy3を利用することにより、実行時間内で間に合います。
Cの取りえる値については、NをA*Bで割った商の部分の内、B以上の値です。

# キーエンスプログラミングコンテスト2021-Nov. (AtCoder Beginner Contest 227)
# C - ABC conjecture

N = int(input())

ans = 0
for a in range (1,10**11):
    if a*a*a > N:
        break
    for b in range (a,10**11):
        if a*b*b > N:
            break
        c = N//(a*b)
        ans += c-b+1

print(ans)

コメント

タイトルとURLをコピーしました