题目链接: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 |
注意二分边界,水题
ac:
//一页 27行就很舒服
#include<stdio.h>
#include<string.h>
#include<math.h>
//#include<map>
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define mod 998244353
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
ll arr[300010];
int n;
bool cmp(ll a,ll b)
{
return a<b;
}
bool judge(ll mid)
{
ll add=0,sub=0;
for(int i=1;i<=n;++i)
{
if(arr[i]>mid)
sub=sub+(arr[i]-mid)/2;
else
add=add+mid-arr[i];
}
if(sub>=add)
return 1;
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
clean(arr,0);
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%lld",&arr[i]);
sort(arr+1,arr+n+1,cmp);//小到大
ll l=arr[1],r=arr[n],mid,ans=-INF;
while(r-l>=0)
{
mid=(l+r)>>1;
if(judge(mid))
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
if(ans==-INF)
printf("-1\n");
else
printf("%lld\n",ans);
}
}