给定一个正整数的集合,要求把它们分成两个不相交的集合。两子集在大小尽量相近的前提下,要满足它们集合里的数的总和之差尽可能大。
因为首要条件是大小相近,那么当给定集合的大小为偶数时只有一种分法,就是一半一半,大的一堆小的一堆。把集合里的数排序,输出较大数减较小数的总和即可。大小为奇数时,中间数放较大的子集时能得到较优解。
#include <bits/stdc++.h>
using namespace std;
int m,n,query;
vector<int> vec;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
int val;
scanf("%d",&val);
vec.push_back(val);
}
sort(vec.begin(),vec.end());
int len=vec.size();
int leftsize,rightsize;
if(len%2==0){
int a=0;
for(int i=0;i<len/2;i++){
a+=(vec[len-1-i]-vec[i]);
}
printf("0 %d",a);
}else{
int a=0;
for(int i=0;i<len/2;i++){
a+=(vec[len-1-i]-vec[i]);
}
printf("1 %d",a+vec[len/2]);
}
}
本文介绍了一种将正整数集合分为两个子集的方法,目标是使子集大小接近且子集内数值总和之差最大化。算法首先排序输入集合,然后根据集合大小的奇偶性,采取不同策略分配数值,确保解决方案的合理性与高效性。
480

被折叠的 条评论
为什么被折叠?



