面试算法 优势洗牌 算法: 贪心

1.题目:优势洗牌
给定两个大小相等的数组A和B,A相对于B的优势可以用满足A[i]>B[i]的索引i的数目来描述。
返回A的任意排列,使其相对于B的优势最大化。
(相同的案例  田忌赛马)


2.算法

贪心算法


3.算法思想:

贪心算法:

1.首先我们要把两个数据数组排序, 
2. 因为B 数组是固定的所以 我们需要  把下标一起记载!
3.贪心思想: 我们的A数组 里面的数, 排列的的规则,只要有大过B 的数,  在A  里面派出  大过B 的数,但是也要在A 里面最小   ,最优解!,


代码:

/*************************************************
作者:She001
时间:2022/9/8
题目:优势洗牌
给定两个大小相等的数组A和B,A相对于B的优势可以用满足A[i]>B[i]的索引i的数目来描述。
返回A的任意排列,使其相对于B的优势最大化。
(相同的案例  田忌赛马)


算法: 
2.贪心算法 
***************************************************/

#include<bits/stdc++.h>
using namespace std;

//贪心算法:
/*
1.首先我们要把两个数据数组排序, 
2. 因为B 数组是固定的所以 我们需要  把下标一起记载!
3.贪心思想: 我们的A数组 里面的数, 排列的的规则,只要有大过B 的数,  在A  里面派出  大过B 的数,但是也要在A 里面最小   ,最优解!,

A  -》 B
下等马   vs   上等马
上等马   vs   中等马
中等马   vs   下等马 
*/ 

int * fangfa_1(int nn[],int mm[],const int n)//nn  A数组   mm B数组   n他们数组元素的个数 
{
	int * daan  =new int[n];
	int num[n];
	int kk;//交换用的工具! 
	for(int i=0;i<n;i++)//记载 B数组元素的位置在哪里 
	{
		num[i]=i;//初始化, 开始的时候他们在  当前的地方, 本应该存在的地方, num[i]  这个数值  ,mm[i]表示这个元素本来存在的地点 是num[i]; 
	}
	
	int mm1[n];
	for(int i=0;i<n;i++)//复制数组 B   
	{
		mm1[i]=mm[i];
	}
	
	
	int nn1[n];
	for(int i=0;i<n;i++)//复制数组 A  
	{
		nn1[i]=nn[i];
	}
	
	
	//因为A数组  不需要记载  原始的数据 下标 所以,我们直接排序 
	sort(nn1,nn1+n);//快排 
	
	
	for(int i=0;i<n;i++)//从小到大 排列B数组  
	{
		for(int j=i+1;j<n;j++)
		{
			if(mm1[i]>mm1[j])	//比大小
			{
				kk=mm1[i];//数据的调换 
				mm1[i]=mm1[j]; 
				mm1[j]=kk;
				
				kk=num[i];//数据i 原来的位置
				num[i]=num[j];//这个地方 放的元素换了,换的元素,开始的位置是啥!
				num[j]=kk; 
			} 
		}	
	}
	/*
	//看看数据是否有错 
	cout<<"a== "<<"  ";
	for(int i=0;i<n;i++)//输出排序过后的数组  a 
	{
		cout<<nn1[i]<<"  ";
	}
	cout<<endl;
	
	cout<<"b== "<<" ";
	for(int i=0;i<n;i++)
	{
		cout<<mm1[i]<<"  ";
	}
	cout<<endl;
	
	cout<<"num = "<<" ";
	for(int i=0;i<n;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl;
	*/
	int h1=0;//标记B数组 
	int h2=0;//标记A数组
	int h3=n-1;//标记返回的数组的尾部空缺位置 

	while(h2<n)
	{
		if(nn1[h2]>mm1[h1])//当我们的A数组的 数值大于  B数组的数值的时候  我们就把这个数值存放到 答案里面 
		{
			daan[num[h1]]=nn1[h2];//这个答案  把他存放在原来  B数组的位置  num[h1]--- >  存放的是B 原来的位置 
			h1++; //我们再次比较下一个数据 
		}
		else
		{
			daan[h3]=nn1[h2];//没有匹配的数据,我们把他放入 答案的最后 
			h3--;//最后的空缺位置往前  走一步	
		}
		h2++; //我们的 A数组 的数值往前走 
	}	
	return daan;//返回答案 
}



int main()
{
	int A[]={2,1,4,3,6,5,8,9,10};
	int B[]={3,4,6,5,1,2,11,12,13};
	int * m=fangfa_1(A,B,9);
	//答案为 4 5 8 6 2 3 10 9 1
	for(int i=0;i<9;i++)
	{
		cout<<m[i]<<"  ";
	}
	
	return 	0;
} 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值