题目大意:
n个人,每个人想参加a[i]轮游戏,但每场游戏必须有个一个人当工具人
问最少有几场游戏
题解:
二分
答案范围:[0,sigma a[i]]
check:首先a[i]>=ans,其次a[i]-ans是这个人能当工具人的场次,所有的和要大于等于ans
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long #define N 200009 using namespace std; int n; LL a[N]; LL l,r,ans; bool check(LL x) { LL p=0; for(int i=1;i<=n;i++) { if(a[i]>x) return false; p=p+x-a[i]; } return p>=x; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]),r=r+a[i]; while(l<=r) { LL mid=(l+r)>>1; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } cout<<ans<<endl; return 0; }