题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6383
题目大意:给你一堆数字,可以随便找两个,一个+1,一个-2,使最后形成的数列最大值和最小值相差为1,求最小值的最大值
题目思路:二分答案,往下降的次数是大于mid的差值的和/2,往上升的次数是小于mid的差值,然后往上升的次数需要大于往下降的,因为往上升需要上面的点降下来,但是降下来上面的点可以通过互相协调慢慢掉下来不需要别人上升。
以下是代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define MAXN 300005
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
#define MOD 2147483648
int a[MAXN];
int main()
{
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
rep(i,1,n){
scanf("%d",&a[i]);
}
int l=0,r=(int)1e8+5;
ll ans=0;
while(l<=r){
int mid=(l+r)>>1;
ll temp=0;
rep(i,1,n){
if(a[i]-mid>0){
temp+=(ll)(a[i]-mid)/2;
}
else{
temp+=(ll)(a[i]-mid);
}
}
if(temp>=0){
l=mid+1;
ans=mid;
}
else{
r=mid-1;
}
}
printf("%lld\n",ans);
}
return 0;
}