更新が間に合っていない.(昨日は寝ていました)
それと最近ついに時間がなくなってきて,問題を解いて勉強するのも難しくなってきました.困ったもんだ.
ようこそ 天下一プログラマーコンテスト2012 A問題
問題
A: 与えられた数より小さい素数の個数について - 天下一プログラマーコンテスト2012 予選C | AtCoder
回答
Submission #395525 - 天下一プログラマーコンテスト2012 予選C | AtCoder
Submission #395533 - 天下一プログラマーコンテスト2012 予選C | AtCoder
素数を数えるだけ.
nが10000以下なので,適当にループさせてもなんとかなる.
あと,rubyだと素数を取り扱えるライブラリがあるようなので,活用して解いてみました.
参考:
require 'prime' puts Prime.each(gets.to_i - 1).to_a.length
Prime.each(N)で0~Nの範囲で(N-1ではなく,Nです)素数を持ってくる.
to_aで配列に変換し,lengthで長さを得る…
こうですね.
K2PC(Easy) A問題
問題
A: ハンバーガー(Hamburger) - Kyuride Kagamiz Programming Contest (Easy) | AtCoder
回答
(ダメな方)
Submission #395520 - Kyuride Kagamiz Programming Contest (Easy) | AtCoder
(修正版)
Submission #395520 - Kyuride Kagamiz Programming Contest (Easy) | AtCoder
これはひどいので,ソースコード張りながらおはなし.
ハンバーガーの具材で足りないものを求めましょうという問題なのですが…
悪い例です.
a, b, c = map(int, input().split()) N = int(input()) oriA, oriB, oriC = a, b, c for _ in range(N): if a < N: a += 1 if b < N * 2: b += 2 if b > N * 2: b -= b % 2 if c < N * 3: c += 3 if c > N * 3: c -= c % 3 print(a - oriA, b - oriB, c - oriC)
- 問題1:ループの使用
いらないような気がしたんですよね,でも怖いしな~
※ループ使っているとそれだけ処理時間が長くなりがちですし,ループ回数が多いと落ちちゃうゾ… 今回は最大でも1000程度だからなんとかなるけど.
- 問題2:似たような処理の重複
簡単に出来るよなあ…
※変数が増えるたびに同じようなことやってたらキリがないゾ…
というわけで,修正したのがこちら.
a, b, c = map(int, input().split()) N = int(input()) calc = lambda mult, x: N * mult - x if N * mult > x else 0 print(calc(1, a), calc(2, b), calc(3, c))
普通に計算式立てたら,N * mult - x で最終的な値が出ることに気が付いたので,これをラムダ式に.そして計算するだけ….(multっていうのは,ハンバーガ一つにかかる具材の必要数ですよ,うん.ハンバーガ一つにつき肉が1,パンが2,具材が3だったかな)
計算式に落とせるならもちろん計算式にしたほうがいいですね(反省)
さて,今回は初めてruby書きましたが,結構短く書けて便利そうなので,今後も機会があれば活用しようかなあと思います.便利なライブラリがあるなら活用すべしでしょうね.