在 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秒,要注意不要超时。