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

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

Codeforces Round #299 (Div.2)

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

A. Tavas and Nafas

ざっくりと大意

・入力で与えられた数を英語表記で出力する。

方針のようなもの

・丁寧に書く。無理に省略した書き方をしようとして抜けがあってWAにならないように。

python

m=['zero','one','two','three','four','five','six','seven','eight','nine']
w=['','','twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety']
d={10:'ten',11:'eleven',12:'twelve',13:'thirteen',14:'fourteen',15:'fifteen',16:'sixteen',17:'seventeen',18:'eighteen',19:'nineteen'}
s=int(raw_input())
if s<10:
    print m[s]
elif d.has_key(s):
    print d[s]
elif s%10==0:
    print w[s/10]
else:
    print '-'.join([w[int(str(s)[0])],m[s%10]])

うーん、、面倒くさい。久しぶりに連想配列使ったのでそれは良かったかもしれない。

B. Tavas and SaDDas

ざっくりと大意

・4,7だけで作られた数がラッキーナンバー。入力で与えられるラッキーナンバーは何番目のものか。

方針のようなもの

・入力で最大値が109になってるけど、実際にはラッキーナンバーしか無いはずなので777777777が最大になるんじゃないかと思う。
・1ずつ加算して4,7のみの数をメモとかTLEで死ねるので他の方法で。

python

n=raw_input()
lst=[]
n=n.replace('4','0')
n=n.replace('7','1')

for i in range(2,1024):
    p=str(bin(i))[3:]
    lst.append(p)

print lst.index(n)+1

4を0、7を1として考えれば1024まで程度に収まって大きい数にはならないのですが、単純に0からbin()していくと先頭の0が消えていってしまう。だが入力では4,44,444などが別々にあり得るのでかなり迷いました。0,1で順列や組み合わせで長さごとに網羅的に用意しようとしたが網羅出来そうなものがなかったりで撃沈。すごい時間かけて悩んでから1桁多く用意して先頭の1を無視する方法を取りました。