问题描述
两千多年前的战国时期,齐威王与大将田忌赛马。双方约定每人各出 300 匹马,并且在上、中、下 3 个等级中各选一匹进行比赛,由于齐威王每个等级的马都比田忌的马略强,比赛的结果可想而知。现在双方各 n 匹马,依次派出一匹马进行比赛,每一轮获胜的一方将从输的一方得到 200 银币,平局则不用出钱,田忌已知所有马的速度值并可以安排出场顺序,问他如何安排比赛获得的银币最多?
Tip: 本题为单组输入
输入描述
第 1 行,一个正整数 n (n \le 100000)n(n≤100000),表示马的数量; 后两行分别是 nn 个整数,表示田忌和齐威王的马的速度值。
输出描述
每个测试用例输出一行,表示田忌获得的最多银币数。
样例输入
Copy to Clipboard
3 92 83 71 95 87 74
样例输出
Copy to Clipboard
200
/*
* @Description: To iterate is human, to recurse divine.
* @Autor: Recursion
* @Date: 2022-05-26 14:09:13
* @LastEditTime: 2022-05-26 14:55:03
*/
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 1e9 + 10;
const int N = 2e+7;
int a[N];
int b[N];
int n;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i ++){
cin >> a[i];
}
for(int i = 1;i <= n;i ++){
cin >> b[i];
}
sort(a + 1,a + n + 1,greater<int>());
sort(b + 1,b + n + 1,greater<int>());
// for(int i = 1;i <= n;i ++ )
// cout << a[i] << endl;
int ans=0;
for(int i=1,j=1,ii=n,jj=n;i<=ii;){
if(a[i] > b[j]){
i++;
j++;
ans += 200;
}
else if(a[i] < b[j]){
ii--;
j++;
ans -= 200;
}
else{
if(a[ii] > b[jj]){
ii--;
jj--;
ans+=200;
}
else{
if(a[ii] < b[j])
ans -= 200;
j++;
ii--;
}
}
}
cout << ans << endl;
return 0;
}
在战国时期的历史故事基础上,田忌面对与齐威王的赛马挑战,利用算法策略优化马匹出场顺序,以求在有限数量的马匹中获得最多银币。输入包括双方马匹数量及速度值,目标是找到最佳排列,使田忌赢得最多的比赛,输出为田忌可能获得的最大银币数。
19万+

被折叠的 条评论
为什么被折叠?



