hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

Atcoder ABC227,226 振り返り

 バーチャルで参加しました.227は複雑なこと色々考えたけど結局解けずに答え見ると非常にシンプルな解法という一番辛いパターンでした.対して226は227Cとほぼ同じdiffの226Dがあっさり解けました(227を本番で解いてたら1700位と過去最高順位だった……).

A - Last Card【AC】

 人は1-indexなのでx%N==0の時人0に配るので無く人Nに配ることに注意します.

N, K, A = map(int, input().split())
print((K+A-1)%N if (K+A-1)%N!=0 else N)
B - KEYENCE building【AC】

 仮にaとbどちらかが0でも3a, 3bとあるのでa, bどちらもSの最大値1000/3=333であることが分かります.余裕を持ってa, b<400として全探索すれば良いです.

N = int(input())
S = [int(i) for i in input().split()]
val = []
ans = 0

for a in range(1, 400):
    for b in range(1, 400):
        men = 4*a*b + 3*a + 3*b
        if men not in val and S.count(men) != 0:
            val.append(men)
            ans += S.count(men)
print(N-ans)
C - ABC conjecture【解説AC】

 Nを素因数分解して何とかしようとずっと考えていた.その結果abc=Nとなるようなパターンの数は(多分)求めることが出来たがabc<=Nは出来なかった.aの取り得る範囲が1<a<N^(1/3)という考察が出来ていなかったのは本当に良くない.そこから繋げて,bの取り得る範囲がa<b<(N/a)^(1/2)で,cの取り得る範囲がb<c<N/abとすればもう求まる.1<a<N^(1/3)とちゃんと考察しなかったからaとbの二重ループでもう間に合わないと勘違いして考察の外に追いやってしまっていた.

N = int(input())
ans = 0

for a in range(1, N+1):
    if a**3 > N:
        break
    for b in range(a, N+1):
        if a*b**2 > N:
            break
        ans += N//(a*b) - b + 1

print(ans)
A - Round decimals【AC】

 文字列.split("区分けしたい文字")と書くことで文字列を区分けしたい文字で分割することが出来ます.これを使って小数部と整数部に分けます.小数第一位で四捨五入するので小数部の0番目を参照し,繰り上げるなら整数部を+1すれば良いです.

a = input()
a,b = a.split(".")
if int(b[0]) <= 4:
    print(a)
else:
    print(int(a)+1)
B - Counting Arrays【AC】

 この設問での数列が同じとは全ての数字が並びも完全一致してた時を言います.よってset型にそのまま数列を入れる事で簡単に種類が求められます.

a = set([])
for _ in range(int(input())):
    a.add(input())
print(len(a))
C - Martial artist【AC】

 N番目の技を習得するのに必要な技を列挙し,その技を習得するのに必要な技を列挙し……を繰り返してつどかかる時間を足していけば良いです.技の探索はBFSを使っています.

from collections import deque
N = int(input())
waza = []
for _ in range(N):
    waza.append([int(i) for i in input().split()])

must_waza = deque([waza[-1]])
flag = [False]*N
time = 0
while must_waza:
    q = must_waza.popleft()
    time += q[0]
    for i in q[2:]:
        if not flag[i-1]:
            flag[i-1] = True
            must_waza.append(waza[i-1])
print(time)
D - Teleportation【AC】

 一つの魔法で前後同時に動くことは出来ないので,二つの街を移動するためには,必ず1つの魔法とその逆向きの魔法合わせて2つの魔法が必要になります.よってi

N = int(input())
loc = []
magic = set([])
for _ in range(N):
    loc.append([int(i) for i in input().split()])

for i in range(N-1):
    for j in range(i+1, N):
        if loc[i][0] == loc[j][0]:
            magic.add(1<<30)
        else:
            magic.add((loc[i][1] - loc[j][1])/(loc[i][0] - loc[j][0]))
print(len(magic)*2)