U - 特工配对

在 A 国有一个秘密特工组织,这个特工组织是由若干对双人组合构成的

现在特工组织有一批新人加入,为了防止背叛,组织规定来自相同城市的人不能配对在一起

现在已知 A 国有 n 个城市,且新人中来自第 i 个城市的有 ai 人,求最多组成几个配对

Input

第一行一个正整数 n

第二行 n 个数,第 i 个数是 ai

1 ≤ n ≤ 103

0 ≤ ai ≤ 109

Output

输出最多组成几个配对

Sample Input

3
1 2 3

Sample Output

3
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
	int n;
	cin>>n;int ma=0,a;ll total=0;
	for(int i=0;i<n;i++){
		cin>>a;
		ma=max(ma,a);
		total+=a;
	}
	if(ma>total-ma){
		cout<<total-ma;
	}
	else cout<<total/2;
	return  0;
}

一开始比较混乱,像这种条件很平均的,思路就不是很显然了。

首先,针对于其中一个,其他所有的都可以配对,这样的一般要有个标准,针对哪一个,多出来的只是一个城市的,只能是最多的城市多出来,其他城市多出的话,可以转化为最多的城市多出来。而最多的城市多出来的情况不一定能转化为其他城市多出来。所以最大城市很特殊。

其次是当多出来的时候,只能以total-ma的答案,无论怎样都不能再多了。

而在小于等于的时候,等于不用说了,假设total为偶数的话,奇数除以二也没什么问题,就是比ma多出来的一部分,可以平分到其他的中间两个,总是可以补成total的,同时由于条件至少除了最大的至少有两个。

还有注意加了超过int 范围。

还有10^7边界是1秒,要注意不要超时。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值