思考する三角形▽

プログラミング初心者によるAtCoder解答解説

C - Otoshidama

コメント歓迎です。
前回の問題と同様の方針でACできました。

前回:B - Sum of Three Integers - 思考する三角形▽


方針

10000円札、5000円札、1000円札それぞれの枚数を変数x, y, zとします。
条件の合計金額Yは与えられているので、x, yが決まるとzは自動的に決まります。
この考え方は前回の問題と同様ですので、前回の記事を参照してください。

x, yはfor文ループで0からNまで変えていきます。
zは自動できまりますが、0以上の整数、かつx+y+z=Nを満たす必要があります。
条件を満たすzが見つかったら問題で定められたフォーマットで出力します。

もし、for文が回りきっても条件を満たすzが見つからなかった場合は、
条件を満たす組み合わせは存在せず、この場合についても問題で定められたフォーマットで出力します。

コード(AC)

#include <iostream>
using namespace std;

int main(){
  // 入力
  int N, Y;
  cin >> N; // 紙幣の合計枚数
  cin >> Y; // 合計金額

  int x, y, z;
  x = 0; //10000円札の枚数
  y = 0; //5000円札の枚数
  z = 0; //1000円札の枚数

  bool endflag = false; // 多重ループから抜けるためのフラグ

  // 全探索 計算量N^2
  for (x = 0; x < N + 1; ++x) {
    for (y = 0; y < N + 1; ++y) {
      z = (Y - x * 10000 - y * 5000) / 1000;
      // zが0以上の整数かつx+y+z=Nなら条件を満たす
      if ((z >= 0) && (x + y + z == N)) {
        // 出力
        cout << x << " " << y << " " << z << " " << endl;
        endflag = true;
      }
      if (endflag) break;
    }
    if (endflag) break;
  }
  // 最後まで条件を満たさなかった場合の処理
  if(endflag == false) {
    cout << "-1 -1 -1" << endl;
  }
}