AtCoder Beginner Contest #009 復習

はい。
http://abc009.contest.atcoder.jp

A - 引越し作業

引っ越しでダンボールを運び切る回数

print(input()+1)/2

繰り上げ??て2で割る。

B - 心配性な富豪、ファミリーレストランに行く。

2番目に高いものを探す。同じ金額のものは同じ順位で扱う。

n=int(raw_input())
a=set()
while n:
    n-=1
    a.add(input())
a=list(a)
a.sort()
print a[-2]

set型で重複を排除して2番目のものを出力する。

C - 辞書式順序ふたたび

元の文字列から位置の変わったものをk個以内にして辞書順で最も早いものをつくる。

# refer from http://abc009.contest.atcoder.jp/submissions/174504
n,k=map(int,raw_input().split())
s=raw_input().rstrip()
f=[0]*26
origin=[0]*26
for i in s:
#ord('a')が97から始まる値であることを意識せず、97を忘れても-ord('a')
#することでリストの先頭0番目からカウントできる
    f[ord(i)-ord('a')]+=1
    origin[ord(i)-ord('a')]+=1

t=''
for i in xrange(n):
    origin[ord(s[i])-ord('a')]-=1
    for j in xrange(26):
        if f[j]>0:
            f[j]-=1
            if ord(s[i])!=ord('a')+j:
                k-=1
            dif=0
            for q in xrange(26):
                dif+=abs(origin[q]-f[q])
            if dif/2<=k:
                t+=chr(j+ord('a'))
                break
            else:
                if ord(s[i])!=ord('a')+j:
                    k+=1
                f[j]+=1
print t

今回も写経。今回のuwiさんのものを。-ord('a')というのは便利そう。 今回の解法の流れはまた後で追いかける。。