名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

今日の競プロ(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って…