给定一个由整数组成的集合,集合中的整数各不相同,现在要将它分为两个子集合:
①、这两个子集合的并为原集合、交为空集;
②、同时在两个子集合的元素个数n1与n2之差的绝对值 |n1-n2| 尽可能小的前提下,
要求它们各自的元素之和S1与S2之差的绝对值 |S1-S2| 尽可能大。
求这个 |S1-S2| 等于多少。
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100010;
//int a[maxn];
//int n;
int randPartition(int a[],int left,int right)
{
int p=round(1.0*rand()/RAND_MAX*(right-left)+left);
swap(a[left],a[p]);
int temp=a[left];
while(left<right)
{
while(left<right&&a[right]>temp) right--;
a[left]=a[right];
while(left<right&&a[left]<=temp) left++; //别忘记等于!
a[right]=a[left];
}
a[left]=temp;
return left;
}
void randSelect(int a[],int left,int right,int k)
{
if(left==right) retur

博客探讨了如何将一个不重复整数构成的集合划分为两个子集合,使得子集合的并等于原集合且交集为空,同时在元素数量差的绝对值最小条件下,其元素和的差值绝对值最大化的问题。
最低0.47元/天 解锁文章
1172

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



