AtCoder Beginner Contest #010に参加しました。
A〜C問題は簡単に解けたのですが、D問題がさっぱり・・・
この辺が、1つの壁のような気がします。
超えるには、まだまだ経験も必要ですし、お勉強も必要なような。
さて、今回解けた3問は全てschemeで解きました。
まず問題Aのコードはこんな感じ。
(display (read)) (display "pp") (newline)
そして実行にかかった時間はなんと1829ms・・・
どうしろと言うんでしょうか。まぁ解けてるからいいか。
そして問題B。
数字での場合分けですね。入力される花びらの数は1以上10未満なので、少し上手く解こうとして時間がかかるくらいなら、1〜10枚まで実際にやってみるのもありですね。
コードはこんな感じ。
;3n+2 ;2nがダメ (define n (read)) (define (answer maisuu) (cond ((and (= (modulo maisuu 2) 1) (< (modulo maisuu 3) 2)) 0) ((and (= (modulo maisuu 2) 1) (= (modulo maisuu 3) 2)) 2) ((and (= (modulo maisuu 2) 0) (= (modulo maisuu 3) 2)) 1) ((and (= (modulo maisuu 2) 0) (= (modulo maisuu 3) 1)) 1) (#t 3))) (define (solve times wa) (if (= times 0) wa (solve (- times 1) (+ wa (answer (read)))))) (display (solve n 0)) (newline)
これの実行時間は343ms。1問目の1/4以下です。どういうことなんでしょうね。文字列の出力が時間かかるのか?うーん。
問題Cは、距離を求めて、ってやつでしたね。僕の実力では、ここまでは簡単、4問目だけめちゃくちゃ難しい、という実感でした。多分、最近ずっとこのくらいの実力で停滞してるんだと思います。
3問目のコードはこちら。
(define (square x) (* x x)) (define txa (read)) (define tya (read)) (define txb (read)) (define tyb (read)) (define candistance (* (read) (read))) (define nn (read)) (define (cango xx yy) (if (<= (+ (sqrt (+ (square (- xx txa)) (square (- yy tya)))) (sqrt (+ (square (- xx txb)) (square (- yy tyb))))) candistance) #t #f)) (define (solve times) (if (= times 0) #f (let* ((thisx (read)) (thisy (read))) (if (cango thisx thisy) #t (solve (- times 1)))))) (define ans (if (solve nn) "YES" "NO")) (display ans) (newline)
これの実行時間は459msでした。
そして4問目はJavaで解こうとして、色々考えたのですが、思いついた解法が合っているかも自信が持てないし、その思いついた解法の実装が上手くできない&めちゃ時間かかる、という感じでした。
アルゴリズム力、実装力の両方が足りていない状態ですね。
アルゴリズムに関しては、例えば木とか、そのいった基礎レベルのところで抜けてる部分が結構あるので、まずはそれをやらんことにはな、と思います。本を読んで理解して書いてみて、と地味な作業になりますが、コツコツやっていくしかないですね。
実装力に関しては、もっとコードを書くしかないと思います。難しい問題をなんとなく避けてるので、WAを出しながら何回も書いて書いて、をしていくべきなのだと思います。嫌だなぁ・・・
とりあえず、今回の問題の解説スライドを読んで、今回のD問題を解いてみます。
今回は以上です。