己のコーディング力に絶望した日
もう少し時間内に思い描いたコードを書けるようになりたいのと,そういや最近文字列処理とかしてなかったなぁと無駄に入力処理で手間取ってしまったという.下のコードは貼るために無駄なimportとか削ったやつです.
Ants
蟻さんが竿の上を歩くという問題.真ん中のやつが一番最小になりそうとか思ってソートしてみるも,「それって偏ってたらおかしくならない?」とアドバイスを貰って修正して何とか書けた.
import std.algorithm, std.stdio, std.conv, std.string; void main() { auto cn = to!uint(readln().strip); foreach (Unused; 0..cn) { auto test = readln().strip.split(" "); auto l = to!uint(test[0]); auto ants = readln().strip.split(" "); auto nums = map!(to!uint)(ants); uint min, max, tmp; foreach (num; nums) { tmp = l - num > num ? l - num : num; if (tmp > max) max = tmp; tmp = l - num < num ? l - num : num; if (tmp > min) min = tmp; } writeln(min, " ", max); } }
区間スケジューリング
仕事をなるべくたくさんやれという問題.なんかいくつか解き方が思いついたんだけど,図に書いてみると当てはまらないのが出て来て,とりあえず早く終わる仕事を選んでおけば問題ないかな,と.「それ証明できる?」と聞かれたけど結局出来ず.なんかDPとかマトロイド理論とかが関わっているらしいと後々教えてもらったけどぐぬぬ…
import std.algorithm, std.stdio, std.conv, std.string, std.typecons; alias Tuple!(uint, "start", uint, "end") Job; void main() { auto cn = to!uint(readln().strip); foreach (Unused; 0..cn) { uint answer, end; Job[] jobs; foreach (Unusedd; 0..to!uint(readln().strip)) { auto job = readln().strip.split(" "); jobs ~= Job(to!uint(job[0]), to!uint(job[1])); } sort!q{ a.end < b.end }(jobs); foreach (ref job; jobs) { if (job.start > end) { answer++; end = job.end; } } writeln(answer); } }
後もう一問「割り切る数」というのがあって計算量無視すれば解けるんだけど,どう考えてもあれなのでこの辺はもう少し考えたい.
P.S.
色々なテスト入力で試してないのでバグっている可能性あり