さて。
帰省中なのもあり、移動中や家族がかまってくれないときなど、時間が結構あるので、モリモリ進めていきます。
継続的な勉強が苦手なので、出来るときに一気に進めとかないといけません。
今回は、前回の続きで、AtCoder Beginner Contest #006のB問題とC問題をやりました。
なぜこの回かというと、唯一D問題まで解けている回だからです。
せっかくだから最後までやりたいですもんね。
配列も使うので、勉強になりそうです。
はい。
まず、B問題から。
普通に?解きます。
program solve(inout, output); var n, counter : Longint; a1, a2, a3, answer : Integer; begin readln(n); if n < 3 then answer := 0 else begin a1 := 0; a2 := 0; a3 := 1; for counter := 4 to n do begin answer := (a1 + a2 + a3) mod 10007; a1 := a2; a2 := a3; a3 := answer; end; answer := a3; end; writeln(answer); end.
ideoneでの動作確認もクリア。提出してみると、ACでした。ちなみに実行時間は63ms。
Schemeで解こうとして、制限時間に苦しめられた過去を考えると、速いもんです。いいぞ、Pascal。
ちなみに、前これを解いたときはSchemeだったので、関数型言語的な考えのもと解きました。
Pascalの練習も兼ねて、関数を作るバージョンでも解いてみました。こんな感じのコード。
program solveWithFunction(input, output); function trib(first,second,third : Integer; now, goal : Longint): Integer; begin if now = goal then trib := first else trib := trib(second,third,(first+second+third) mod 10007,now+1,goal) end; var n : Longint; begin readln(n); writeln(trib(0,0,1,1,n)); end.
これでももちろんACになりました。ただ、実行時間が111msと、上の手続き的な解法に比べて時間がかかってしまいました。
場合にもよるんでしょうが、やっぱり手続き的に解いた方がいいんですかね。
続いて、ABC006のC問題も解きました。
こちらも簡単ですね。コードはコチラ。
program solve(input, output); var n, m : Longint; adult, old, baby : Longint; begin read(n); readln(m); if ((m < 2 * n) or (n * 4 < m)) then begin adult := -1; old := -1; baby := -1; end else begin if m <= 3 * n then begin old := m - 2 * n; adult := 3 * n - m; baby := 0; end else begin baby := m - 3 * n; old := 4 * n - m; adult := 0; end end; writeln(adult,' ',old,' ',baby); end.
注意点として、(当たり前かも知れませんが)"readln()"でやると、1つ要素を読んだ後、次の行に飛んでしまいます。
今回は2つの入力が同じ行で与えられるので、1つ目の入力は"read()"としなければなりません。ひっかかりました。
あと、elseのあとにbegin〜endを使うと、そこには;がいらないとか、どこまでが文でセットなのかを意識しないといけません。結構ややこしい。
また、Sublime Text 2のPascalモードで、対応するbeginとendをハイライトしてくれる機能があればいいのになーと思いました。自分でそれを追加できるほどの技術が欲しいところです・・・
さて、今回は以上です。
次のD問題も解いたら、まぁ今までJavaでやっていたことはあらかたPascalでも出来るようになった、と言えるんじゃないでしょうか。
頑張ってPascalとSchemeでやっていくぞ−!