概述
题目要求
- 给出一个无序数组,要求把数组分成数组A1和数组A2,并满足两个数组元素个数差最小,元素和sum差最大
思想
- 随机排序思想:以n/2为基准,用快速排序划分数组。
代码:
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 100010;
int A[MAXN],n;
//寻找n/2大的数字的位置,并根据这个位置把数组分成两半
//思想:随机选择一个数,一趟快排,然后递归
int randPartition(int A[],int left,int right)
//随机选择一个数字进行划分
{
int P=(round(1.0*rand()/RAND_MAX*(right-left)+left));
swap(A[P],A[left]);
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 randomSelect(int A[],int left,int right,int K)
//比较一趟快排和k的结果,递归
{
if(left==right) return;
int p=randPartition(A,left,right);
int M=p-left+1;
if(M==K) return;
if(M<K) return randomSelect(A,p+1,right,K);
else return randomSelect(A,left,p-1,K);
}
int main()
{
srand((unsigned)time(NULL)); //初始化随机数字
int sum=0,suml=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>A[i];
sum+=A[i];
}
randomSelect(A,0,n-1,n/2);
for(int i=0;i<n/2;i++)
suml+=A[i];
cout<<sum-suml-suml;
return 0;
}
最后
以上就是炙热糖豆为你收集整理的算法相关_快排递归+随机数的全部内容,希望文章能够帮你解决算法相关_快排递归+随机数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复