齐威王与大将田忌赛马。双方约定每人各出300匹马,并且在上、中、下三个等级中各选一匹进行比赛,由于齐威王每个等级的马都比田忌的马略强,比赛的结果可想而知。现在双方各n匹马,依次派出一匹马进行比赛,每一轮获胜的一方将从输的一方得到200银币,平局则不用出钱,田忌已知所有马的速度值并可以安排出场顺序,问他如何安排比赛获得的银币最多。
函数接口定义:
void solve();
裁判测试程序样例:
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAX 1001
//问题表示
int n;
int a[MAX];
int b[MAX];
//求解结果表示
int ans;
void solve();
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++)
scanf("%d",&a[i]);
for (int j=0;j<n;j++)
scanf("%d",&b[j]);
solve();
printf("%d\n",ans);
return 0;
}
/* 请在这里填写答案 */
输入样例:
第一行正整数n(n≤1000)马的数量,后两行分别是n个整数,表示田忌和齐威王的马的速度值。
3
92 83 71
95 87 74
输出样例:
每个测试用例输出一行,表示田忌获得的最多银币数。
200
参考代码
void solve() {
// 对两个数组进行排序
sort(a, a+n);
sort(b, b+n);
// 初始化指针和答案
int i = 0, j = 0, x = n-1, y = n-1;
ans = 0;
// 当两个数组都有元素时
while(i <= x && j <= y) {
// 如果田忌的马比齐威王的马快
if(a[x] > b[y]) {
// 田忌赢得比赛,获得200银币
ans += 200;
// 移动指针
x--;
y--;
}
// 如果田忌的马比齐威王的马慢
else if(a[x] < b[y]) {
// 如果田忌的马比齐威王的马慢
if(a[i] < b[j]) {
// 田忌输掉比赛,失去200银币
ans -= 200;
}
// 移动指针
i++;
y--;
}
// 如果两匹马的速度相同
else {
// 如果田忌的马比齐威王的马慢
if(a[i] < b[j]) {
// 田忌输掉比赛,失去200银币
ans -= 200;
}
// 如果田忌的马比齐威王的马快
else if(a[i] > b[j]) {
// 田忌赢得比赛,获得200银币
ans += 200;
}
// 移动指针
i++;
j++;
}
}
}