AtCoder Beginner Contest #019 参加記
はい。 oo--
C問題は何を言ってるのかわからなかったけど、わかったらわかったで他に書き方もないようなで単に私の練習不足だったと思う。
http://abc019.contest.atcoder.jp
A - 高橋くんと年齢
3つの整数から中央値を取るのでソートして真ん中をとった。
l=map(int,raw_input().split()) l.sort() print l[1]
3つの数から中央値を取るのに総和からmaxとminを引くという手法もあったらしい。。
B - 高橋くんと文字列圧縮
なんか同じ文字が続いてたらその文字と連続してる数に置き換えるらしい。
n=raw_input() ans=chk='' cnt=0 for i in n: if chk!=i and chk!='': ans+=chk ans+=str(cnt) chk=i cnt=1 else: chk=i cnt+=1 ans+=chk ans+=str(cnt) print ans
先頭から探して見つけた文字をメモして1からカウントして、違う文字が出てきたら見つけた文字メモとカウント数を回答予定に追記する。という感じのことを繰り返した。
C - 高橋くんと魔法の箱
xを入れても2xを入れても出てくる整数が同じ魔法の箱 −> 2で割れなくなるまで割りつくして結果を返す魔法の箱らしい。
n=int(raw_input()) l=map(int,raw_input().split()) ans=set() def waru(x): while 1: if x%2==0: x/=2 else: break return x for i in l: ans.add(waru(i)) print len(ans)
2で割れなくなるまで割るのはそんなに何回もではないと思う。素因数分解での2の個数分までだろうし。。 ですがループを回さなくても良かったらしいです。
C問題、2で割れるだけ割るというのは「n/(n&-n)」でできます。n&-nが立っている一番下のbitを取り出すテクニックで、それの応用です。
— not(情報系専攻でゎなぃ) (@not_522) 2015, 2月 28
そしてこのn/(n&-n)を使って無理に短く書くと、
raw_input() print len(set([(i/(i&-i)) for i in map(int, raw_input().split())]))