由于题目具有十分明显的单调性(若 \(x\) 局能满足要求,则 \(>x\) 局一定能满足;若 \(x\) 局无法满足要求,则 \(<x\) 局也无法满足),因此我们考虑进行二分答案。
二分所需要的局数 \(x\),设所有人想玩的总局数为 \(S\),由题意可得 \(S=\sum^{n}_{i=1}a_i\)。因为每局都会有 \(1\) 人主持,\(n-1\) 名选手,所以当局数为 \(x\) 时总选手为 \((n-1) \times x\),显然这个值应当 \(\ge S\) 才能满足所有人的要求。
因此在二分时,若 \((n-1) \times x \ge S\),则向右区间扩展(因为要求最少局数),否则向左区间扩展即可。需要注意二分左右边界的设定。
#include<bits/stdc++.h>
#define int long long //(可能)需要开 long long
using namespace std;
int n,s,m,a[100031];
signed main(){
cin>>n;
for(int i=1;i<=n;i++) //读入并求出 S
cin>>a[i],s+=a[i],m=max(m,a[i]);
int l=m-1,r=s+1; //注意左右边界设定
while(l+1<r){
int mid=(l+r)>>1;
if(mid*(n-1)>=s) r=mid; //满足条件就向右扩展
else l=mid; //否则向左扩展
}
cout<<r; //注意输出的是 r(因为是最小值)
return 0;
}