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

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

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

Codeforces Round #295 (Div.2)

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

A. Pangram

ざっくりと大意

・入力で与えられるn文字の文字列の中にアルファベット全26文字(大文字小文字どちらか)が含まれているか。

方針のようなもの

・全部数える。

python

n=int(raw_input())
s=raw_input()
lst=[0]*26
for i in s:
    i=i.lower()
    lst[ord(i)-97]+=1
print 'YES' if 0 not in lst else 'NO'

どちらでもいいのですが今回は全てlower()で小文字に置換して出現する文字を調べて最後に判定しました。大文字にすればordして-65だったり、そもそもnが26未満なら成立があり得なかったりするのですが、今回の問題の制限の範囲では特に気にする要素でもなかったかと思います。

B. Two Buttons

ざっくりと大意

・2つの数n,mが与えられる。
・赤いボタンを押すとnが2倍になる。青いボタンを押すとnが1減る。という操作を最小回数でnとmを等しくする。

方針のようなもの

・手順を全探索してたら無駄が多すぎてTLEが解消できなかったので、解説や他の人の回答を見ました。。

python

n,m=map(int,raw_input().split())
ans=0
while 1:
    if n==m:
        break
    if m<n:
        m+=1
    else:
        if m%2==0:
            m/=2
        else:
            m+=1
    ans+=1

print ans

操作する対象をnではなくmにする。 そうすると赤いボタンが2で割る、ただしmが奇数の時はこの操作は行われない(nが赤いボタンを押して奇数になることがあり得ないため)。青いボタンでは1増える。
mの方が小さい時は1増やす。mの方が大きくなったら2で割ることが優先だが奇数の時は1増やす、そして次の手順のときに2で割ることになる。
n,mの関係で取るべき手順が必ず1種で良くて、赤青の両方の手順を配列に保存してから新たな手順では配列の中にある数に対して赤青の結果を保存してとか全く必要なかったらしいです。。