yutasの競技プログラミング勉強帖

競技プログラミングの問題についての解説記事を主に書いています。

B - Next / AtCoder Beginner Contest 329

問題

 n 個の整数  {a}_{1}, {a}_{2}, \cdots , {a}_{n} が与えられる。 このうち、最大でない整数の中で最大の整数を求めよ。

入力

最初の1行目に、整数  n が与えられる。

その次の1行に、 n 個の整数  {a}_{1}, {a}_{2}, \cdots , {a}_{n} が順に与えられる。

条件

  •  2 \leq n \leq 100
  •  1 \leq {a}_{i} \leq 100
  •  {a}_{1}, {a}_{2}, \cdots , {a}_{n} が全て等しいということはない。

出力

答えとなる整数を出力すること。

解法

整数  {a}_{1}, \cdots , {a}_{n} について、降順にソートしたものを  {b}_{1}, \cdots , {b}_{n} とします。 このとき、 \begin{align} {b}_{1} \geq {b}_{2} \geq \cdots \geq {b}_{n} \end{align} が成立します。

従って、降順にソートされた数列  \{{b}_{i}\} について、 i = 1 から順にforループを回していき、初めて  {b}_{i} \ne {b}_{1} である  {b}_{i} が現れたら、その値が答えとなります。

問題の条件から、  {a}_{1}, \cdots, {a}_{n} がすべて等しいということはないので、このような  {b}_{i} の値は必ず存在します。

ソースコード

以下のようにして、main() の中に直接答えを出力するようにしました。

int n, a[105];

int main() {
  // 値の入力
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }

  sort(a, a + n, greater<int>()); // 数列 a を降順でソートする

  for (int i = 0; i < n; i++) {
    if (a[i] == a[0]) {
      continue; // a[i] が最大値(a[0]) のときは次の i を見る
    }

    cout << a[i] << endl; // 最大値でないときはその値を出力させ、forループから抜ける
    break;
  }

  return 0;
}