http://acm.hdu.edu.cn/showproblem.php?pid=6383
Problem Description 度度熊很喜欢数组!!
Input 输入的第一行有一个正整数 T ,代表接下来有几组测试数据。
Output 对于每一组测试数据,请依序各自在一行内输出一个整数,代表可能到达的平衡状态中最大的『数组中的最小值』,如果无法达成平衡状态,则输出 −1 。
Sample Input 2 3 1 2 4 2 0 100000000
Sample Output 2 33333333
Source
|
分析:
二分查找答案,只要cc>=aa,这个数肯定能实现x为平衡数组的最小值,但不一定是最大的,所以要让l=mid+1。。(一定记得要long long )
代码:
#include<bits/stdc++.h>
using namespace std;
long long int n;
long long a[301005];
struct node
{
long long int id,numm;
};
long long int go(long long int x)
{
long long int aa,bb,cc,i,j,num,num2;//aa为小于 bb 为大1的个数 cc为远大的个数
aa=bb=cc=0;
long long flag;
flag=0;
num=0;
for(i=1;i<=n;i++)
{
if(a[i]<x)
{
aa+=(x-a[i]);
}
else
if(a[i]==x)
num=i;
else
if(a[i]>x+1)
{
cc+=(a[i]-x)/2;
if((a[i]-x)%2==0)bb++;
else
flag=1;
}
}
if(aa>cc)
return 1;
return 0;
}
int main()
{
long long tt,i,j,l,r,mid,maxn,ans,ok;
scanf("%lld",&tt);
while(tt--)
{
scanf("%lld",&n);
maxn=0;
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
sort(a+1,a+n+1);
l=a[1];
ans=a[n];
r=a[n];
while(l<=r)
{
mid=(l+r)>>1;
ok=go(mid);
if(ok==0)
ans=mid,l=mid+1;
else
r=mid-1;
}
printf("%lld\n",ans);
}
}