刷题记录第五十天-优势洗牌(田忌赛马问题)

本文介绍了一种使用C++编程解决比赛马匹问题的解题思路,通过比较两个向量nums1和nums2中最快的马匹速度,确定最优策略并输出比赛结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路在于:
如果nums1最快的马比nums2最快的马还快,那么就直接用nums1这匹马跟nums2比。因为此时是最优做法。
如果nums1最快的马比nums2最快的马慢,那么nums1中任意一只马都是输,此时就选择nums1中最慢的马跟nums2比。

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
	vector<int> nums1{12,24,8,32};
	vector<int> nums2{13,25,32,11};
	vector<int> index1(nums1.size());
	vector<int> index2(nums1.size());
	for(int i=0;i<nums1.size();i++){
		index1[i]=i;
		index2[i]=i;
	}
	//利用匿名表达式语法自定义比较函数,并且[&]表示以引用的方式捕获外部变量 
	sort(index1.begin(),index1.end(),[&](int i,int j){return nums1[i]<nums1[j];});
	sort(index2.begin(),index2.end(),[&](int i,int j){return nums2[i]<nums2[j];});
	int left=0,right=nums1.size()-1;
	vector<int> result(nums1.size());
	for(int i=nums1.size()-1;i>=0;i--){
		if(nums1[index1[right]]>nums2[index2[i]]){
			result[index2[i]]=nums1[index1[right]];
			right--;
		}else{
			result[index2[i]]=nums1[index1[left]];
			left++;
		}
	}
	for(int i:result){
		cout<<i<<" ";
	}
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值