正经题解|田忌赛马Easy
2026-05-16 19:55:17
发布于:河北
5阅读
0回复
0点赞
思路分析(希望能帮到你):
1、分别将田忌和齐王的马按升序排序,方便贪心。
2、贪心策略:
①当田忌最快的马比齐王最快的马更快时,田忌赢一次。
②当田忌最快的马比齐王最快的马慢时,用田忌最慢的马换掉齐王最快的马。
③当田忌最快的马比齐王最快的马一样快时,如果田忌最慢的马比齐王最慢的马快,田忌赢,否则用田忌最慢的马消耗掉齐王最快的马。
3、注意使用双指针。
4、不要忘了累加(或减少)结果。
代码演示:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
// 提高输入输出速度
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n=0;
cin>>n; // 读入数组长度
// 定义两个大小为n的向量
vector<int> a(n),b(n);
// 读入数组a
for(int i=0;i<n;++i) cin>>a[i];
// 读入数组b
for(int i=0;i<n;++i) cin>>b[i];
// 对两个数组进行升序排序
sort(a.begin(),a.end());
sort(b.begin(),b.end());
// 初始化双指针:a数组左右指针,b数组左右指针
int a_left=0,a_right=n-1,b_left=a_left,b_right=a_right,sum=0;
// 当a数组左指针小于等于右指针时循环
while(a_left<=a_right){
if(a[a_right]>b[b_right]){ // a的最大值大于b的最大值
sum+=200; // 奖金+200
a_right--; // a右指针左移
b_right--; // b右指针左移
}else if(a[a_right]<b[b_right]){ // a的最大值小于b的最大值
sum-=200; // 奖金-200
a_left++; // a左指针右移
b_right--; // b右指针左移
}else{ // a最大值等于b最大值
if(a[a_left]>b[b_left]){ // a最小值大于b最小值
sum+=200; // 奖金+200
a_left++; // a左指针右移
b_left++; // b左指针右移
}else{ // a最小值小于等于b最小值
if(a[a_left]<b[b_right]) sum-=200; // 若a最小值小于b最大值则奖金-200
a_left++; // a左指针右移
a_right--; // a右指针左移
}
}
}
cout<<sum; // 输出最终得分
return 0;
}
全部评论 1
1周前 来自 河北
0








有帮助,赞一个