君はまるで砂漠に咲く、一輪の花。

僕はその花に引き寄せられる蝶。

Codeforces Round #292 (Div.2)

はい。
http://codeforces.com/contest/515

A. Drazil and Date

ざっくりと大意

・Drazilは(0,0)の位置からスタートして、1回移動ごとに縦か横に+-1移動する。
・s回丁度の移動回数で(a,b)にたどり着けるか?

方針のようなもの

・スタートとゴールが何マス離れているかと移動回数を偶奇で見る。

python

a,b,c=map(int,raw_input().split())

if abs(a)+abs(b)<=c and (a+b)%2==c%2:
    print 'Yes'
else:
    print 'No'

確認するポイントは偶奇の一致と移動回数>離れているマス数であること。ゴールは負の座標の場合があるので絶対数で計算する。

B. Drazil and His Happy Friends

ざっくりと大意

・Drazilには沢山のハッピーかアンハッピーなn人の男友達とm人の女友達がいるが、友人たちはみんなハッピーになってほしいと思っている。
・夕食会を毎日開いて各男女1人ずつ(i日目にはiの剰余の番目の人)を呼んでどちらかがハッピーで、もう一方がアンハッピーであった場合は会が終わるとハッピーになれる。
・入力は1行目がn,mで男女の人数、2行目がハッピーな男子の人数と何番目の人であるか、3行目がハッピーな女子の人数と何番目の人であるかが与えられる。

方針のようなもの

・とりあえずはn・m回をシミュレートしてみる。

python

n,m=map(int,raw_input().split())
boy=[0]*n
girl=[0]*m

for i,j in enumerate(map(int,raw_input().split())):
    if i!=0:
        boy[j]=1

for i,j in enumerate(map(int,raw_input().split())):
    if i!=0:
        girl[j]=1

x=n*m
chk=0
while x>chk:
    if boy[chk%n]==1 or girl[chk%m]==1:
        boy[chk%n]=1
        girl[chk%m]=1
        flag=1
    chk+=1

print 'Yes' if 0 not in boy or 0 not in girl else 'No'

解法とは別件なのですけど2,3行目の入力の方式がとてもやり難いです。。
もっと少ない回数でも判定できるらしいですけど、今回はn・m回シミュレートしてどちらかのリストにアンハッピーな人が残っていなければYes、残っている場合はNoと判定するようにしました。

C. Drazil and Factorial

ざっくりと大意

・ある関数F(x)がある。関数は例として、F(135)=1!・3!・5!=720 といった計算で各桁の階乗の全ての積である。
・入力で与えられるn桁の数のaを使用して導かれるF(a)の結果と等しくなるF(x)のxの最大値を探す。
・xのルールとしては0,1のどちらも含まない。また、aとxが同じ値である場合があり得る。

方針のようなもの

・サンプルの1と2がすごい親切なヒントになっていて2,3,5とかは置き換えなくても良さそうで、他の数で置き換えが必要なモノとそうでないモノを事前に調べておく。

python

n=int(raw_input())
a=raw_input()
ans=[]
for i in a:
    if i=='4':
        ans.extend([2,2,3])
    elif i=='6':
        ans.extend([3,5])
    elif i=='8':
        ans.extend([2,2,2,7])
    elif i=='9':
        ans.extend([2,3,3,7])
    elif i!='1' and i!='0':
        ans.append(int(i))
ans.sort()
ans=ans[::-1]
print ''.join(map(str,ans))

置き換えが必要になるのは4,6,8,9の時で、0,1は無視して捨てる。 それ以外の数はそのまま使える。使う数が決まったら最後に降順で並べて出力する。