AtCoder Beginner Contest #004 の復習

はい。
http://abc004.contest.atcoder.jp

A - 流行

Nを2倍にして出力する。

print input()*2

素直に2倍する。

B - 回転

180度回転させたものを出力する。

l=[]
for i in range(4):
    l.append(raw_input())
for i in range(-1,-5,-1):
    print l[i][::-1]

下の行の右側から出力させれば180度回転になるものだった。コンテスト当時は気づかずに配列を作りなおしてましたけど。。

C - 入れ替え

カードの位置を入替えていって最終形を出力する。

n = int(raw_input())
l = ['1','2','3','4','5','6']
x,y=0,n%30
 
while x<y:
    l[(x%5)],l[(x%5)+1]=l[(x%5)+1],l[x%5]
    x+=1
print ''.join(l)

最終型出力と言っても並び順が30回周期で初期に戻るのでN%30の回数をシミュレートすれば大丈夫なはず。

D - マーブル

-100,0,100の位置にあるR,G,Bのマーブルを全ての位置で1つ以下になるようにする。

q = map(int, raw_input().split())
ans=0
def oz(w):
    k=(1+w)*(w/2)
    if w%2:
        k+=(w+1)/2
    return k
 
def ygnk(x):
    l=r=x/2
    if x%2:
        l+=1
    return oz(l)+oz(r)
 
for i in q:
    ans+=ygnk(i-1)
print ans

これは部分点40にまで対応。部分点40の制限のR,G,B<=40なら各色がお互いに干渉すること無く1つ以下になるように広げることが出来る。左右に均等に広げていくとそれぞれが離れた距離の分だけ移動に手数が掛かっているため1から離れている距離の総和で手数の合計が求まる。
満点解法は後で。。