HDU 6383 p1m2(二分)

度度熊很喜欢数组!! 

我们称一个整数数组为稳定的,若且唯若其同时符合以下两个条件: 

1. 数组里面的元素都是非负整数。 
2. 数组里面最大的元素跟最小的元素的差值不超过 11。 

举例而言,[1,2,1,2][1,2,1,2] 是稳定的,而 [−1,0,−1][−1,0,−1] 跟 [1,2,3][1,2,3] 都不是。 

现在,定义一个在整数数组进行的操作: 

* 选择数组中两个不同的元素 aa 以及 bb,将 aa 减去 22,以及将 bb 加上 11。 

举例而言,[1,2,3][1,2,3] 经过一次操作后,有可能变为 [−1,2,4][−1,2,4] 或 [2,2,1][2,2,1]。 

现在给定一个整数数组,在任意进行操作后,请问在所有可能达到的稳定数组中,拥有最大的『数组中的最小值』的那些数组,此值是多少呢? 

Input

输入的第一行有一个正整数 TT,代表接下来有几组测试数据。 

对于每组测试数据: 
第一行有一个正整数 NN。 
接下来的一行有 NN 个非负整数 xixi,代表给定的数组。 

* 1≤N≤3×1051≤N≤3×105 
* 0≤xi≤1080≤xi≤108 
* 1≤T≤181≤T≤18 
* 至多 11 组测试数据中的 N>30000N>30000

Output

对于每一组测试数据,请依序各自在一行内输出一个整数,代表可能到达的平衡状态中最大的『数组中的最小值』,如果无法达成平衡状态,则输出 −1−1。

Sample Input

2
3
1 2 4
2
0 100000000

Sample Output

2
33333333

代码:

   

#include<iostream>
using namespace std;
const int maxn=300005;
typedef long long ll;
ll a[maxn];
int n;
int main()
{
    int t;
	cin>>t;
	while(t--)
	{
	 	cin>>n;
	 	ll sum=0;
	 	for(int i=0;i<n;i++)
	 	{
	 	   scanf("%lld",&a[i]);
	 	   sum+=a[i];
		}
	 	   
	 	ll l=0,r=sum/n;
	 	ll maxx=0;
	 	while(l<=r)
	 	{
	 		ll c1=0,c2=0;
	 		ll m=(l+r)>>1;
	 		for(int i=0;i<n;i++)
	 		{
	 		   if(a[i]<=m) c1+=(m-a[i]);
			   else   c2+=(a[i]-m)/2;	
			}
			if(c1<=c2)
			{
				maxx=max(maxx,m);
				l=m+1;
			}
			else
			{
				r=m-1;
			}
		}
		cout<<maxx<<endl; 
	}	
	return 0;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼爱吃火锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值