Codeforces Round #217 (Div. 2)
はい。
http://codeforces.com/contest/370
A. Rook, Bishop and King
ざっくりと大意
・(r1,c1)から(r2,c2)へ移動するのにルーク、ビショップ、キングの移動手数を出力。
方針のようなもの
・ルークは縦横どちらかどちらか等しければ1、どちらも異なれば2。
・ビショップは(r1+c1)と(r2+c2)の偶奇が異なると0、斜めに探して移動先があれば1、なければ2。
・キングはr2とr1、c2とc1の差の絶対値が大きいほうが移動手数。
bs=[(-1,-1),(-1,1),(1,1),(1,-1)] #start = time.clock() r1,c1,r2,c2=map(int,raw_input().split()) ans=[] chk=0 if r1==r2 and c1==c2: print 0,0,0 exit() if r1==r2 or c1==c2: ans.append(1) else: ans.append(2) if (r1+c1)%2!=(r2+c2)%2: ans.append(0) else: for i in range(4): a,b=r1,c1 while 1: a+=bs[i][0] b+=bs[i][1] if a==r2 and b==c2: chk=1 break if a<0 or a>8 or b<0 or b>8: break if chk==1: ans.append(1) break elif i==3: ans.append(2) ans.append(max(abs(r2-r1),abs(c2-c1))) print ' '.join(map(str,ans))
B. Berland Bingo
ざっくりと大意
・Berlandでは国家規模ビンゴ大会が流行っていて、n人の参加者がそれぞれカードを持っている。
・カード内には同じ番号があったり、i番目のプレイヤーのカードには\(m_i\)が含まれている。
・数字は都合のいいシナリオを想定して消せるものは消す。同時に揃ったらどっちも負け。
n //n人の参加者 -> 以降にn行分の数列が出力される m a a //先頭にmで残ってる数字の個数と以降に実際に何が残ってるかが与えられる m a a a m a
方針のようなもの
・問題文と入力の把握まですげー時間かかった。把握すれば書いてあるとおりなんですけど。。。
・残りが自分と同じか少ない人だけチェックかな?残りが多い人に対しては都合のいい数字しか出ないので必ず勝てる。
・残りが(1)の人と(2,4,1)の人がいると1だけの人は勝てるが2,4,1の人は1を先に出せばその時点で負け、最後の3番目にしても同時揃いは負け。
・探しやすいようにソートして後は全部適当に比較しても時間は間に合うかな??
n=input() chk=[1]*n l=[] for i in range(n): m=map(int,raw_input().split()) m.insert(1,i) l.append(m) l.sort() for i in xrange(n): for j in xrange(n): if i==j: pass elif l[i][0]<l[j][0]: break elif len(set(l[i][2:]+l[j][2:]))==l[i][0]: chk[l[i][1]]=0 break for i in chk: print 'YES' if i else 'NO'
受け取り時に m, 番目, 以下番号 にして受け取って、 m で長さ基準になるようにしてsort。自分より長くなるまで番号リストを結合してset型に長さが自分と同じ長さになった、結合対象分の長さが全て消えたら自分はその人に勝つことを阻まれるのでNO扱いに。。