Python
AtCoder
競技プログラミング

問題はhttp://abc004.contest.atcoder.jp/ から

C問題

解答の方針

入れ替えに周期性がある。
30回操作を行うと初期化するため、
N%30を利用する。

以下のような二つの処理があると考える。
1.先頭の数字が最後に移動する
2.隣の数字と入れ替わる

1の処理は、N%30//5回行われ、
2の処理はn%5回行われる。

コード

abc04c.py
N = int(input())
num = ["1","2","3","4","5","6"]
n = N%30
m = n//5
s = n%5

for i in range(m):
    a = num.pop(0)
    num.append(a)

for i in range(s):
    k = num[i]
    p = num[i+1]
    num[i] = p
    num[i+1] = k

print("".join(num))

D問題部分点

解答の方針

R,G,Lともに、どのように広げても重なることはないのである程度適当に考えてもできそう。

中心からの距離が大きくなるにつれて、重みづけをする。
R-1//2回繰り返し処理をし、重みの和を求める
R-1が奇数なら、広げた先で左右どちらかが空くので、条件文を書き加える

コード

abc04d.py
R,G,B = list(map(int,input().split()))

r = R-1
g = G-1
b = B-1
ans = 0

for i in [r,g,b]:
    n = 0

    for j in range(1,i//2+1):
        ans += 2*j
        n = j
    if i%2 == 1:
        ans += n+1

print(ans)

D問題満点