公式

B - ドミノ倒しの一撃 / A Single Strike of Dominoes 解説 by kyopro_friends


\(X=\max(A)\) とすれば明らかに全ての柱を破壊することができます。

衝撃 \(X\) を与えたとき、各柱が受けるダメージは \(X\)\(X+1\) のどちらかです。よって、全ての柱を破壊するには \(\max(A)-1\) 以上の衝撃を与える必要があります。

以上より、全ての柱を破壊することができる \(X\) の最小値は \(\max(A)-1\)\(\max(A)\) かのどちらかであるため、\(X=\max(A)-1\) のケースをシミュレーションし、全ての柱を破壊することができれば \(\max(A)-1\) 、できなければ \(\max(A)\) が答えとなります。

なお、実際にはシミュレーションすることなく、\(A_1=\max(A)\) かどうかのみで判定できます。

いずれの場合も計算量は \(O(N)\) です。

実装例 (C++)

#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];

  int M = *max_element(a.begin(), a.end());
  if(a[0] == M){
    cout << M << endl;
  }else{
    cout << M - 1 << endl;
  }
}

実装例 (Python)

N = int(input())
A = list(map(int, input().split()))

M = max(A)
if A[0] == M:
  print(M)
else:
  print(M - 1)

投稿日時:
最終更新: