読者です 読者をやめる 読者になる 読者になる

Codeforces Round #395 (Div.2) 参加記

codeforces 参加記

はい。 ox— (0/0) 1287(-87)
http://codeforces.com/contest/764
Aのみ1完。B問題はサンプルとノートだけ見て適当なのを提出して爆死。実際にはそんなに難しくはなかったのですが。。

A. Taymyr is calling you

ざっくりと大意

・z分間でlliaはn分毎に1分行動、Artistsはm分毎に1分行動する。行動が被るのは何回あるか??

Python3

def gcd(a,b): return a if b==0 else gcd(b,a%b)
def lcm(a,b): return a*b//gcd(a,b)

n,m,z=map(int,input().split())
print(z//lcm(max(n,m),min(n,m)))

zと最小公倍数の商が解になると思う。

B. Timofey and cubes

ざっくりと大意

・誕生日プレゼントで箱たくさんもらった。箱には\(a_i\)の番号がある。
・iからn-i+1番目(0番目から-1番目)の間を反転させる作業を中央に着くまで繰り返した結果の数列aから元の数列を作成する。

Python3

#!/usr/bin/env pypy3
# -*- coding: UTF-8 -*-

from collections import deque

n=int(input())
a=[int(i) for i in input().split()]
chk=deque()
if n%4==0:
    for i in range(n//2):
        if i==0:
            chk.append(n//2-1)
            chk.append(n//2)
        elif i%2==1:
            chk.appendleft(chk[-1]+1)
            chk.append(chk[1]-1)
        else:
            chk.appendleft(chk[-1]-1)
            chk.append(chk[1]+1)
elif n%4==2:
    for i in range(n//2):
        if i==0:
            chk.append(n//2)
            chk.append(n//2-1)
        elif i%2==1:
            chk.appendleft(chk[-1]-1)
            chk.append(chk[1]+1)
        else:
            chk.appendleft(chk[-1]+1)
            chk.append(chk[1]-1)
elif n%4==3:
    chk.append(n//2)
    for i in range(n//2):
        if i%2==1:
            chk.append(chk[0]+1)
            chk.appendleft(chk[-2]-1)
        else:
            chk.append(chk[0]-1)
            chk.appendleft(chk[-2]+1)
else:
    chk.append(n//2)
    for i in range(n//2):
        if i%2==1:
            chk.append(chk[0]-1)
            chk.appendleft(chk[-2]+1)
        else:
            chk.append(chk[0]+1)
            chk.appendleft(chk[-2]-1)

ans=[a[i] for i in chk]
print(*ans)

コンテスト中にはWAで終わった。もう少しキチンと問題文読んで手動でシミュしてれば出来ない問題ではなかったと思う。 あと、4パターンに分けてるごちゃごちゃ書いているけども他の人のコードではもっと短いし、ifで4分岐とかしてないので簡略化できるっぽい。