题目链接:传送门
题意:有n个人在玩游戏,每局游戏只能玩n-1个人,剩下的一个人去当裁判
第i个人想玩ai局,问最少玩多少局能使得每个人都能玩完他们想玩的局。
做法:先求出sum(a[i]),求出最大的a[i]为Max
那么玩局数至少是Max,Max*(n-1)就是玩Max局数的总人数 如果它大于sum,则玩Max局就能让所有人都玩完。
否则则要找出某个局数x使得 x*(n-1)>=sum,因为sum比较大,所以普通搜容易T,这里就用二分搜索,二分的下界是Max 上界是sum。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 100001
int a[N];
int main(){
int i,j,n,m;
while(scanf("%d",&n)!=EOF){
long long int sum=0;
for(i=1;i<=n;i++)
{cin>>a[i];
sum+=a[i];
}
sort(a+1,a+1+n);
long long int res=a[n];
if(sum<=a[n]*(n-1)){
cout<<a[n]<<endl;
continue;
}
res=a[n];
long long int r=sum;
while(res<r){
long long int mid=(res+r)/2;
if(mid*(n-1)>=sum) r=mid;
else res=mid+1;
}
cout<<res<<endl;
}
return 0;
}