みずまずぷろぐらみんぐ日記

日々学んだことや頭に浮かんだことを、そこはかとなく書き連ねます

はじめての C問題挑戦!

ABS(AtCoder Beginners Selection)

昨日からABS(AtCoder Beginners Selection)に取り組み始めました。昨日はA問題とB問題の計8問を解いたので、今日は残りのC問題を解いていきます。

ABC085C Otoshidama

1パターンでも見つかればOKなので全部調べる必要はない→多重ループを一気に抜けたいな→goto文の出番か?と言うことでAPG4bで知ったgotoを初めて使った。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int n, Y;
  cin >> n >> Y;
  //x+y+z=n,10000x+5000y+1000z=Y => 10x+5y+z=Y/1000
  for (int x = 0; x <= n; x++) {
    for (int y = 0; y <= n - x; y++) {
      int z = n - x - y;
      if (10*x + 5*y + z == Y / 1000) {
        cout << x << ' ' << y << ' ' << z;//多重ループ抜ける
        goto OUT;
      }
    }
  }
  cout << "-1 -1 -1";
  OUT:
}

(学習した内容が実戦で思い浮かんで、自分で使えるようになる瞬間って嬉しいね)
……のは良いのだが

エラー。

何もおかしくないと思うのになーと思いつつエラー出力を見てみる。

え~~、'}'の数も合ってますが。

ここでAPG4bの解説*1を思い出す。


"goto文はシンプルな機能ですが、シンプルすぎるためにプログラムが何を意図しているのか分かりにくいことをはじめ、いくつかの落とし穴があります。"


"いくつかの落とし穴があります。"


もしやラベル(この場合OUT)で終わることはできなくて、後に何か処理がないと使えないのか?
しかしもう何もする処理がない。
そう言えばmain関数はreturnを省略してるとかこれまたAPG4bの関数の節で読んだ気がする……のでこうしてみた。

  OUT:
  return 0;
}

通りました。

goto文

これを機会にgoto文についてリファレンスを読んでみました。

goto 文 - cppreference.com

なるほどね。
そもそもこのgoto文、"ラベル : 飛ぶ先の文"という使い方をするためのものでした。
つまりラベルの後には何らかの"文"が必要。(goto"文"ってそういうこと?)ないとエラーになる。
今回return 0;を入れたのは…まぁだいたい合ってました?←
今後こういうブロックの最後なんかにラベル置く時は、空文( ;)ってのを入れることにします。

初陣のコンテスト(ABC169)ではA問題しかACできなかったこともあり"C問題なんて自分には早いのでは?"と思っていましたが、この問題をACしたことで"自分でも(解ける問題は)解ける"ということがわかり、少し自信が持てました。

ABC086C Traveling

ということで調子に乗って残り2問もさらっとAC~~~

…できれば良かったのですが、ぇ…何これ難しい()

比較的方針が見えたこちらの問題を何とか形にして提出してみるのだが、最後のafter_contest_01というテストケースだけ通らない。
いや自分合ってるし!これ以上どこも直すとこないもん!
と、ひねくれかけたその瞬間

ありました。

はい、私が悪かったです。

xとyのマイナスの移動を考慮していませんでした。

そういえば絶対値ってどうすんだ?場合分けとかそんな面倒なことするのか?と思いググってみると、abs関数という便利なものがすぐに見つかりました。
該当箇所に使ってみたらあっさりAC。
………ジャッジって凄いですね。ほんとにジャッジしてるんですね。

今日もまた新しい知識が増えました^^


え?あと1問残ってないかって?

それは………明日やりますので(;^ω^)

atcoder.jp