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

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

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

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の機械の仕組みには今ひとつ納得できない。。