Codeforces Round #356 (Div.2)
はい。
http://codeforces.com/contest/680
A. Bear and Five Cards
ざっくりと大意
・数列tの中で重複している数を2つか3つ捨てて、tの総和を最小にする。
・サンプル2のように重複する数が1つもない場合は初期状態のtの総和が解になる。
・サンプル3のように全てが同じ数の場合は重複している3つを捨てて残り2つの和が解になる。
Python2
t=map(int,raw_input().split()) p=[0] for i in t: if t.count(i)==2: p.append(i*2) elif t.count(i)>2: p.append(i*3) p.sort() print sum(t)-p[-1]
最初はset型にして要素数が1,2,3,4,5のそれぞれの場合と、重複している数が2,3,4,5の場合とで細かく場合分けをして書いた。だが数列tを探索して2,3,...個重複しているものを捨てられる数をメモしておいて、最後にtの総和からメモした中で最大の数を引けば大丈夫だった。1つも重複がない場合のために配列に0を入れておくことと、重複4個以上でも捨てられるのは3個なのが注意事項だと思う。
B. Bear and Finding Criminals
ざっくりと大意
・Bearlandには1番からn番までの都市がある。i番目とj番目の都市間の距離は|i-j|である。
・Limakは都市aにいる警察官で犯罪者を捕まえないとならないが、各都市ごとに犯罪者はいても最大1人である?
・a番目の都市が1ならaと距離0の都市(a自身)に犯罪者が1人いることを特定できる。
・a-1番目が1で、a+1番目が0だとaと1離れた都市に1人いるはずだがどちらの都市にいるのかはわからない。
・但し、a-1番目が1で、a+1番目が既に終端過ぎで都市がない場合はa-1番目に1人いることを特定できる。
・a-1番目が1で、a+1番目も1だとa-1とa+1の両方にいることになり2人を特定できる。
Python2
n,a=map(int,raw_input().split()) t=map(int,raw_input().split()) ans=chk=0 if t[a-1]==1: ans+=1 a-=1 for i in range(1,n+1): if a-i<0 and a+i>=n: break if a-i>=0 and a+i<n: if t[a-i]==1 and t[a+i]==1: ans+=2 elif a-i>=0: if t[a-i]==1: ans+=1 elif a+i<n: if t[a+i]==1: ans+=1 print ans
aから1ずつ離れていって+-の両方を同時に確認したら大丈夫だった。だがしかし問題文のBCDの機械の仕組みには今ひとつ納得できない。。