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

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

AtCoder ABC 368 B - Decrease 2 max elements (6Q, 灰色, 200 点)

言われた通りにシミュレーションする問題!

問題概要

長さ  N の正の整数からなる数列  A_{1}, A_{2}, \dots, A_{N} が与えられる。この数列に対して

  • 降順にソートする
  •  A_{1}, A_{2} から 1 を引く

という操作を「数列に含まれる正の数が 1 個以下」になるまで繰り返す。操作は何回行うことになるか?

制約

  •  2 \le N \le 100
  •  1 \le A_{i} \le 100

考えたこと

問題文に書かれた通りにシミュレーションすればよいだろう。なお、

「数列  A に含まれる正の数が 1 個以下」であるか

を判定するには、次のようにするのが楽だと思われる。


  • 数列  A を降順にソートする
  • このとき、数列の先頭の要素を除いてすべて負の数であるかを判定する

なお、このようにした場合、次の操作の「 A を降順にソートする」は前のターンでやってしまうことになるた、改めてやる必要はなくなる。

コード

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

int main() {
    int N;
    cin >> N;
    vector<int> A(N);
    for (int i = 0; i < N; i++) cin >> A[i];
    sort(A.begin(), A.end(), greater<int>());

    int res = 0;
    while (A[1] > 0) {
        A[0]--, A[1]--;
        sort(A.begin(), A.end(), greater<int>());
        res++;
    }
    cout << res << endl;
}