水面下の夢

競プロやイラストに興味があります.メインブログがここ.同人サークル「かのらぶ」のページはこっち( https://yumechi0525.amebaownd.com ).ブログアイコンはYaQ(@8_9_00)さんから.

yukicoder open 2015 small に参加しました

3問目は撃墜されました.弱いコードでした.66位でした.

1問目 No.191 供託金

問題

No.191 供託金 - yukicoder

回答

#22427 No.191 供託金 - yukicoder

ぼく「平均より小さければ30万」
ち が い ま す

読み間違えていました.1 / 10 以下ならでしたね.
こんなんで何度も出し直してたら時間がもったいないです.ダメダメ.
そこ直したらAC.

読み込んだものをリストにして,for文で回してチェック,これだけでOKではないでしょうか.

N = int(input())
moneys = list(map(int, input().split()))
th = sum(moneys) / 10
res = 0
for i in range(N):
    res += 30 if th >= moneys[i] else 0
print(res)
2問目 No.192 合成数

問題

No.192 合成数 - yukicoder

回答

#22455 No.192 合成数 - yukicoder

解説聞いてましたけど,これ偶数だったらそのまま出力,そうでなければ1足して出力でいいみたいですね.
ぼくはアホなので,てきとうに5の倍数に揃えました.(5の倍数が揃えやすいと思ったからですね.2の倍数でよかったわけですが)
それと問題文の理解に非常に時間がかかりました.はい.

print(int(input()) // 5 * 5)
3問目

問題

No.193 筒の数式 - yukicoder

元の回答コード

#22521 No.193 筒の数式 - yukicoder


訂正版

#22728 No.193 筒の数式 - yukicoder

> この時、数式の最初や最後が演算子になってはいけない。
これはわかった

> leading zeroは認める。
これはよくわからない.

まあいいや → 大会後,チャレンジで見事に落とされる.
はい.ちなみに修正前のコードはこれ.

S = input()
maxnum = -9999999999999999999999999
length = len(S)
ckecknum = lambda x: not (x == "+" or x == "-")
for i in range(length):
    line = S[i:length] + S[0:i]

    # frist and end check
    first = line[0]
    end = line[length - 1]
    if not ckecknum(first) or not ckecknum(end):
        line = ""
        continue
    
    try:
        maxnum = max(maxnum, eval(line))
    except:
        pass
print(maxnum)

具体的に言うと,こういうパターンがダメ.

01+011+011

元のコードだと多分一つも計算出来ないかららだめ.

leading zeroっていうのはあれです,例えば

011

は次のように解釈する.

11

ということです.

どうやらpython3のevalではleading zeroを認めていない模様.
evalの言語仕様よく知らなかったので,勉強になりました.
そして参加者すごすぎて怖いです.もっと強いコード描かなきゃ(白目)

一応,訂正後のコードならば通るのですが,かなり冗長になってしまったので,だめですね…
(エラーチェックとか多すぎると思う)

改善点として,leading zeroは正規表現でひっかけるのが良いと思う.

S = input()
maxnum = -9999999999999999999999999
length = len(S)
checknum = lambda x, line: not (line[x] == "+" or line[x] == "-")
for i in range(length):
    line = S[i:length] + S[0:i]
    tline = line

    if not checknum(0, line) or not checknum(len(line) - 1, line):
        continue
    
    j = 0
    while tline[j] == "0":
        j += 1
    if not checknum(j, tline):
        tline = tline[j - 1:len(tline)]
        
    j = 1
    while j < len(tline):
        if not checknum(j - 1, tline) and tline[j] == "0":
            if j == len(tline) - 1:
                break
            else:
                if checknum(j + 1, tline):
                    tline = tline[0:j] + tline[j+1:len(tline)]
        else:
            j += 1

    for i in range(len(tline) - 1):
        if not checknum(i, tline) and not checknum(i + 1, tline):
            line = ""
            break
    else:
        line = tline

    try:
        maxnum = max(maxnum, eval(line))
    except:
        pass
print(maxnum)


残りの問題はわかりませんでした.
フィボナッチの1問目は前半半分のテストケースは通したけど,後半はさっぱり.
他の人のコード見る限りでは,DPっぽいけどさっぱりわからん.


本当はこの後CodeForceの問題も見てみようかと思いましたが,どうやら登録が間に合わなかったようで,また今度になりそうです.
あと情報の登録なんですが,大学名とか都市名とか存在しなくて真顔.誰も参加してないのかな….
不安ですねえ.

あと言語モード切り替えてなかったので,最初ロシア語で困惑しました,英語にすぐ切り替えたけどw


yukicoderに関しては,★3~★4解けるようにならなきゃなと思います.
もっともっと問題を解いて,解法について調べて,みたいな作業を繰り返していかなきゃだめですね.


というわけで,今日はこれにておしまい.

追記

解説としてリンクされていたので,少し修正してみました.