けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 317 A - Potions (灰色, 100 点)

「はじめて条件を満たす場所を捉える」という for 文の使い方をする

問題概要

飼っているモンスターの現在の HP は  H である。

 N 種類の薬があって、それぞれ効き目は 小さい順に  P_{1} \lt P_{2} \lt \dots \lt P_{N} である。薬  i を使うと HP は  P_{i} だけ増加する。

モンスターの HP を  X 以上にできるような、薬の番号の最小値を求めよ。

考え方

基本的には次のように考えればよい (0 始まりで考えている)。

for (int i = 0; i < N; ++i) {
    // HP が X 以上になるとき
    if (H + P[i] >= X) {
        cout << i+1 << endl;  // 0 始まりを 1 始まりに直す
        break;
    }
}

つまり、「はじめて条件を満たす瞬間を捉える」という for 文の使い方をするのだ。もし break を怠ると、その後の  i もすべて出力されてしまうので注意。

コード

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

int main() {
    int N, H, X;
    cin >> N >> H >> X;
    vector<int> P(N);
    for (int i = 0; i < N; ++i) cin >> P[i];
    
    for (int i = 0; i < N; ++i) {
        if (H + P[i] >= X) {
            cout << i+1 << endl;
            break;
        }
    }
}