今日の問題はこちら。
比較的解きやすい問題だと思うので、手を動かしてやってみてください。
提出コードと考え方
以下では「西、東」を「左、右」と書きます。また、旅館は左から \(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自体は最大の要素のイテレータを返すので、値が欲しい時は時は「*」を忘れずに。
コメント