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;
}