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の個数分までだろうし。。 ですがループを回さなくても良かったらしいです。

そしてこのn/(n&-n)を使って無理に短く書くと、

raw_input()
print len(set([(i/(i&-i)) for i in map(int, raw_input().split())]))