かみぺさんのコンテストでした.3完.
解説はこの辺りにあるそうです.
(目に優しい)解説です https://t.co/sRaQDW8jZH
— お前がかみぺコン3 本日21時なんだよ (@camypaper) 2015, 11月 22
Zig-Zag Step
回答
本番のC++
https://www.hackerrank.com/contests/camypapercon03/challenges/zig-zag-step/submissions/code/4265169
短く書こうとして失敗したbash
https://www.hackerrank.com/contests/camypapercon03/challenges/zig-zag-step/submissions/code/4265902
140文字以内に入れようとして完全勝利したruby
Programming Problems and Competitions :: HackerRank
A問題解けた
gets.to_i.times{x,y=gets.split(" ").map(&:to_i);d=(x.abs-y.abs).abs;puts (d<2)?"Possible":"Impossible";}
— 千里 由芽知 (@yumechi0525) 2015, 11月 22
解説いわく,||X|-|Y||<=1 になるようなときPossible になるみたいですね.
本番は|x+y|<=1と|x-y|<=1 のどちらかになればOKと見ていました.一応カバーできている範囲は同じはずですが,解説読んだ時に少し不安になりました(数学忘れかけているので,範囲カバーで来てるかどうかがとっさに理解できなかった)
とりあえず解説読んだ後に書いたrubyのコードを以下には貼っておきます….
gets.to_i.times do x,y=gets.split(" ").map(&:to_i) d=(x.abs-y.abs).abs puts (d<2)?"Possible":"Impossible" end
Adventure Calendar Contesuto
回答
本番で書いたC++
https://www.hackerrank.com/contests/camypapercon03/challenges/adventure-calendar-contesuto/submissions/code/4265268
Ruby
https://www.hackerrank.com/contests/camypapercon03/challenges/adventure-calendar-contesuto/submissions/code/4266129
1行にしてツイートに利用したruby
https://www.hackerrank.com/contests/camypapercon03/challenges/adventure-calendar-contesuto/submissions/code/4266136
B問題出来ました
n=gets.to_i;a=gets.split(" ").map(&:to_i);res,sum=0,0.0;for i in 0...n do sum+=a[i];res=[res,(sum/(i+1)).ceil].max;end;puts res
— 千里 由芽知 (@yumechi0525) 2015, 11月 22
本番では一旦,配列に出てくる最大の値を,最大値にして,条件を満たしているかどうかをシミュレーションしつつ,二分探索で探しました.
結局,1からnまで max( ((a1+..+ai)/i).ceil ) で計算してこれの最大値を求めるだけで良いみたいです.二分探索自身がなかったから,こっちの回答のほうが良かったなと解説を見て思いました.ちょっと考察不足だったかも.
n=gets.to_i a=gets.split(" ").map(&:to_i) res,sum=0,0.0 for i in 0...n do sum+=a[i] res=[res, (sum/(i+1)).ceil].max end puts res
歯車と箱
回答
https://www.hackerrank.com/contests/camypapercon03/challenges/gear-and-box/submissions/code/4265438
屑は素因数分解をサボって多倍長で殴った.通った.ごめんなさい.
C問題素因数分解しないといけないんですね(さぼって,long longより大きな値を扱える世界に言って無理やり計算した)
— 千里 由芽知 (@yumechi0525) 2015, 11月 22
https://t.co/7YLdO5m9o6 素因数分解をサボってCをPythonで通す屑
— 千里 由芽知 (@yumechi0525) 2015, 11月 22
@camypaper 途中までC++で書いていて「あ,これ,多分オーバーフローして値おかしくなってる… こういうの考えるのめんどくさいからとりあえずPythonで書いてやってみよう」→AC という流れで素因数分解をするという考察機会を失ってしまいました…(Sorry)
— 千里 由芽知 (@yumechi0525) 2015, 11月 22
多倍長で殴る前の考察はあってた.
分子に大きい方半分,分母に小さい方半分固める.
で,本来の回答であれば,素因数分解した結果を記録しておき,最後に計算して戻す…
ということでしたが,結局大きめの素数だらけになってくると計算できねえなこれと思い,(逐次MOD取ればいいだけだと思うんですけど(名推理))結局多倍長で殴る方針へ.
通ってしまった… oh....
MOD = 1000000007 def gcd(a, b): if a < b: a,b = b,a while b > 0: r = a % b a,b = b,r return a n = int(input()) arr = [int(i) for i in input().split()] arr.sort() numer = 1 denom = 1 for i in range(n//2): numer *= arr[i] denom *= arr[n-1-i] divnum = gcd(numer, denom) numer //= divnum; numer %= MOD; denom //= divnum; denom %= MOD; print(int(denom), int(numer))
ぐるぐるツアー
問題
https://www.hackerrank.com/contests/camypapercon03/challenges/guruguru-tour
とりあえず自分の実力では手も足も出ず.
近いところ行って,次に近いところを求めて… という感じでなんとかならないかなあと思ったものの,結局そこから改善ができませんでした.
そもそもの巡回セールスマン問題とか,ダイクストラとかの考え方を余り知らないので,勉強不足を実感したのでした.まる.
結構問題解けたので楽しかったです.
3問目の考察を結果的にサボる形になってしまったのは,申し訳なかったです….