经过前面的一番折腾,这种题已经不是问题。
只是考虑全面就行了。
题意:发红包准备发m块钱,n个人,已经发了k个人。
求要成为运气王,至少需要在剩余的钱中得到多少钱,每人得到的钱数都大于0.
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int MAXN = 1*1e5+10;
int a[MAXN];
int n,m,k,sum;
bool judge(int mid) {
if(mid>*max_element(a,a+k)&&mid>m-sum-mid-(n-k-2))
return true;
return false;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
sum=0;
scanf("%d%d%d",&n,&m,&k);
for(int l=0; l<k; l++) {
scanf("%d",&a[l]);
sum+=a[l];
}
int l=1,r=m-sum-(n-k-1);
int mid;
int ans=0;
while(l<=r) {
mid=l+r>>1;
if(judge(mid)) {
r=mid-1;
ans=mid;
} else
l=mid+1;
}
if(ans==0)
printf("Impossible\n");
else
printf("%d\n",ans);
}
return 0;
}