![見出し画像](https://assets.st-note.com/production/uploads/images/33299371/rectangle_large_type_2_0977f7b4570b7daf78b0ce984be55950.jpg?width=1200)
AtCoder Beginner Contest 176を見直すC - Step
問題
人が一列に並んでいてその身長が整数の列で与えられます。それぞれの人の足元に高さが0以上の台を設置して、自分よりも前に台を含めて自分よりも背の高い人がいないようする場合、設置する台の高さの合計を出力しなさい。
言い換えると
整数の数列が与えられるので、一つ前の数字よりも小さい場合は差を足し、足した差の和を求める。それをそのままコードにしたのが以下。
提出したコード
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using namespace std;
using ll = long long;
using vi = vector<int>;
int main() {
int n;
cin >> n;
vi a(n);
rep(i, n) cin >> a.at(i);
int previous = a.at(0);
ll ans = 0;
for (int i = 1; i < n; i++){
if (previous > a.at(i)) {
ans += previous - a.at(i);
}
else previous = a.at(i);
}
cout << ans << endl;
}
解説を見るとforの中身は以下のように更にシンプルにかけます。
for (int i = 1; i < n; i++){
previous = max(previous, a.at(i);
ans += previous - a.at(i);
}
やってることは一緒ですが、if文を使ってないためこちらの方が見易くて良いと思います。
この記事が気に入ったらサポートをしてみませんか?