Official

B - MissingNo. Editorial by kyopro_friends


\(A_1,\ldots,A_N\) を並び替えても答えは変わらないので、ソートすることで \(A_1<\ldots< A_N\) であるとしてよいです。

もし隣接する \(2\) 項の差が \(2\) である箇所があれば、その間の数が答えです。答えが一意に定まるという条件から、必ずそのような箇所がちょうど \(1\) 箇所存在します。

この解法の計算量は \(O(N\log N)\) です。

実装例(Python)

N = int(input())
A = sorted(list(map(int,input().split())))
for i in range(N-1):
  if A[i+1] - A[i] == 2:
    print(A[i] + 1)

実装例(C++)

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

int main(){
  int n;
  cin >> n;
  vector<int> a(n);
  for(auto &x:a) cin >> x;
  sort(a.begin(), a.end());
  for(int i=0; i<n-1; i++){
    if(a[i+1] - a[i] == 2){
      cout << a[i]+1 << endl;
    }
  }
}

少し工夫するとソートすることなく \(O(N)\) でこの問題を解くこともできます。考えてみましょう。
(ヒント:\(A_i\) の最小値を全体から引くと、値がとりうる範囲が \(0\) から \(N\) になります)

posted:
last update: