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

AtCoder Beginner Contest 026 参加し忘れた記

はい。 ゲームに夢中になってて参加し忘れました。。。
http://abc026.contest.atcoder.jp/

A - 掛け算の最大値

python

print (int(raw_input())/2)**2

入力は偶数だけじゃないと嫌だなぁと思ってたら問題文にきちんと書かれていたので、単純に2で割ったもの同士で掛け算で大丈夫でした。これが必ず最大値になるといえる数学での証明は知りませんが・・

B - N重丸

python

pi=3.141592653589
n=int(raw_input())
l=[]
for i in range(n):
    l.append(int(raw_input()))
l.sort()
l=l[::-1]
ans=chk=0
for i in range(n):
    if i%2==0:
        ans+=l[i]**2*pi
    else:
        ans-=l[i]**2*pi
print ans

外側から交互に円の面積を足したり引いたりしていると自然に赤の部分だけになるはずです。多分。。

C - 高橋君の給料

python

n=int(raw_input())
 
def sol(x):
    l=[0]*(n+1)
    money=[0]*(n+1)
    soshiki=[[] for i in range(n+1)]
    for i in range(2,n+1):
        s=int(raw_input())
        l[i]=s
    for i in range(n+1):
        if l[i]!=0:
            soshiki[l[i]].append(i)
    for i in range(n+1):
        if len(soshiki[i])==0:
            money[i]=1
 
    for i in range(-1,-n-1,-1):
        if money[i]==0:
            yasu=taka=money[soshiki[i][0]]
            for j in soshiki[i]:
                yasu=min(yasu,money[j])
                taka=max(taka,money[j])
            money[i]=yasu+taka+1
    print money[1]
                
        
 
if n==1:
#maybe,input_data dose not exist 1.....
    print 1
else:
    sol(n)

問題文の意味や入力の内容の把握に苦戦しました。把握してからも実装にも苦戦。多分リアルタイムで参加してても解けなかったと思う。解説で述べられているところのもらう型の方式だと思う。社員番号に対応した部下リストを用意して、社員番号が大きい方から部下リスト内のminとmaxでお給料決めたらより小さい社員番号を見に行って。。。という感じで。配るとか再帰はぱっと見では分からなかったのでまた後で。。