可能有些慢|可过题解
2026-08-26 23:20:57
发布于:广东
4阅读
0回复
0点赞
直接看注释, very详细。
看过田径赛马的题解应该都认识我。
嘻嘻
/*
* 程序功能:模拟田忌赛马策略,计算田忌在与齐王赛马时的最大收益。
* 规则:赢一场得200分,输一场扣200分,平局不得分。
* 算法思路:
* 1. 将双方马的速度按从大到小排序。
* 2. 贪心策略:
* - 对于田忌的每一匹马,优先尝试赢齐王最慢且能赢的马。
* - 若赢不了,则尝试与齐王速度相同的马打平。
* - 若既赢不了也平不了,则用这匹马去输给齐王最快的马,以减少损失。
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, a[1010]{}, b[1010]{}; // n为马的数量,a数组存储田忌马的速度,b数组存储齐王马的速度
int main(){
// 输入马的数量
cin >> n;
// 输入田忌的n匹马的速度
for(ll i=1;i<=n;i++){
cin >> a[i];
}
// 输入齐王的n匹马的速度
for(ll i=1;i<=n;i++){
cin >> b[i];
}
// 将双方马的速度按降序排序
sort(a+1,a+n+1,greater<ll>());
sort(b+1,b+n+1,greater<ll>());
ll ans=0; // ans用于累计得分,初始为0
// 遍历田忌的每一匹马
for(ll i=1;i<=n;i++){
bool p = false; // 标记当前马是否已经完成匹配
// 策略1:尝试赢取齐王未匹配且速度最慢的马
for(ll j=1;j<=n;j++){
// 如果当前马未匹配(p==false),且田忌的马速大于齐王的马速,且齐王的该马未被使用
if(!p && a[i]>b[j] && b[j]!=-1){
ans+=200; // 赢一场,加200分
p = true; // 标记为已匹配
b[j] = -1; // 将齐王的这匹马标记为已使用(-1表示已匹配)
}
}
// 策略2:如果无法赢取,则尝试寻找速度相同的马打平
if(!p){
for(ll j=1;j<=n;j++){
// 如果当前马未匹配,且双方马速相等,且齐王的该马未被使用
if(b[j]==a[i] && !p){
b[j] = -1; // 将齐王的这匹马标记为已使用
p = true; // 标记为已匹配(平局不加分也不扣分)
}
}
}
// 策略3:如果既不能赢也不能平,则输给齐王最快的可用马,以保留己方好马
if(!p){
for(ll j=1;j<=n;j++){
// 如果当前马未匹配,且齐王的该马未被使用
if(b[j]!=-1 && !p){
b[j] = -1; // 将齐王的该马标记为已使用
ans-=200; // 输一场,扣200分
p = true; // 标记为已匹配
}
}
}
}
// 输出最终得分
cout << ans << '\n';
return 0;
}
这里空空如也







有帮助,赞一个