水面下の夢

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

今日の競プロ(2015/04/14)

AtCoderの回答者数が多いものから順に埋めていってる.

Code Festival C

C: 2月29日 - CODE FESTIVAL 2014 予選A | AtCoder

なんかやたらミスが多かった.
最初は数え上げてB - Aでやっても間に合うだろうと思ったけど,TLE出るし,WAでるし,全然ダメでした.
諦めて,最初まじめに考えた方法で.
0~400年の状態を表を作り,その表と年数で上手く計算する.
うるう年だったら1,そうでなければ0を返すラムダ式*1

uru = lambda x: 1 if (x % 400 == 0 or x % 100 != 0) and x % 4 == 0 else 0

関数名がださい*2
あとは1年からx年までに何回うるう年があったのか計算するラムダ式を作って.

calc = lambda x,l:x // 400 * l[400] + l[x % 400]

(1年からB年までのうるう年の回数) - (1年からA年までのうるう年の回数) + もしAがうるう年なら1を足す,といったものを出力すればOK.

A, B = map(int, input().split())
tlist = [0 for _ in range(401)]
uru = lambda x: 1 if (x % 400 == 0 or x % 100 != 0) and x % 4 == 0 else 0
for i in range(1, 401):
    tlist[i] = tlist[i - 1] + uru(i)
calc = lambda x,l:x // 400 * l[400] + l[x % 400]
print(calc(B, tlist) - calc(A, tlist) + uru(A))

Submission #385792 - CODE FESTIVAL 2014 予選A | AtCoder


最後の数値出力が上手くいかず,苦戦しました.Aがうるう年の場合とか,そうじゃない場合考えれば良いのは思いつかなかったんだ(白目)

あと他の方のソースコードを見てみると,もっとスマートに年数を計算していたり,calendarをインポートして計算している人もいました.すげえ.

天下一プログラマーコンテスト2013予選A A問題

A: 天下一株式会社採用情報 - 天下一プログラマーコンテスト2013予選A | AtCoder

なにげに初めての入力なしのプログラムでした.単にwhileループ回すだけでOK.

Submission #385797 - 天下一プログラマーコンテスト2013予選A | AtCoder

Typical DP Contest A問題

A: コンテスト - Typical DP Contest | AtCoder

ぼくはDPが苦手です.ですが,この問題はなんとか回答出来ました.
多分本来の回答は配列を準備して,予め入りうる値を全部入れて,forループで加算したものの結果を見るような形だと思いました(適当に書いているので外れているかもしれません)

まあ,ぼくはアホなので,map関数とset使えば普通に表現できるんじゃねと考えました.
普通にとおちゃったよ….

N = int(input())
ls = list(map(int, input().split()))
s = set([0])
for i in range(0, N):
    s |= set(map(lambda x: x + ls[i], list(s)))
print(len(s))

Submission #385852 - Typical DP Contest | AtCoder


こんなんでいいんですかね… ええ…
set使うことにより重複した要素の計算を行うことなく,できます.
listとかsetでかこうだけでリストやセット作れるホント楽ですね….



DPは今のところかなり苦手なのです.更新をどうやっていいのかとかその辺りがわかりません.

*1: そういえば最近Javaラムダ式書こうとしましたが,全然勝手が違ったし,pythonのほうがラムダ式書きやすくていいです…

*2: うるうだからuruって…