【競プロ】1日1AC : ABC124 B問題

今日の問題はこちら。

比較的解きやすい問題だと思うので、手を動かしてやってみてください。

提出コードと考え方

以下では「西、東」を「左、右」と書きます。また、旅館は左から \(0,1,\cdots ,N-1\) の番号が振られているとします。
旅館 \(i\ (\neq0)\) から海が見えるためには、\(H_i\) がそれより左の旅館の高さの最大値以上であればいいです。

最大値を探すときにループを回してもいいのですが、ちょっと便利なやり方があります。

*max_element(H.begin(),H.begin()+i)

とすると \(H_0,H_1,\cdots ,H_i\) の最大値を取れます。括弧内では調べる値の範囲をイテレータで指定します。
これを使えばこのように実装できます。

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

int main(){
    int N;
    cin >> N;
    vector<int> H(N);
    for(int i = 0;i < N;i++) cin >> H[i];
    int ans = 0;
    for(int i = 0;i < N;i++){
        int value = *max_element(H.begin(),H.begin() + i);
        if(H[i] >= value) ans++;
    }
    cout << ans << endl;
    return 0;
}

終わりに

イテレータは自分も詳しく知らないのでそのうち記事にまとめたいです。ちなみに、max_element自体は最大の要素のイテレータを返すので、値が欲しい時は時は「*」を忘れずに。

コメント