田忌赛马
题目描述
中国古代一个有名的故事 ” 田忌赛马” 。 田忌和齐王赛马, 他们各有 n 匹马,依次派出一匹马进行比赛, 每一轮获胜的一方将从输的一方获得200 银币, 平局则不用出钱。其中每匹马只能出场一次,每匹马有一个速度值,在比赛中速度快的马一定会获胜。田忌知道所有马的速度值,且田忌可以安排每轮双方出场的马。问田忌如何安排马的出场顺序,使得最后获得的钱最多?
输入
输入包含若干组数组, 每个数据的第 1 行是一个整数 n (n≤1000),表示齐王和田忌各有 n 匹马, 后面的两行每行有 n 个数,分别表示田忌n 匹马和齐王 n 匹马的速度值。测试数据以 0
结束。
输出
输出有若干行,每行输出对应一组输入。输出是一个整数,表示田忌最多获得的钱数 (损失钱则用负数表示)。
输入输出样例
样例输入 #1
复制
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
样例输出 #1
复制
200
0
0
思路:
1.如果田忌最快的马比齐王最快的马要快,两者进行比赛
因为,田忌其它的马不一定比齐王最快的马要快,田忌最厉害的既然能打过齐王最厉害的马,那就比赛,击败他
2.如果田忌最快的马比齐王最快的马要慢,那么齐王的这匹最快的马无论如何都是打不败的,那么就让田忌最弱的马去和齐王这匹最强的马比赛,做到损失最小化。3.如果田忌最快的马和齐王最快的马一样快,那么就比较他们最慢的马
3.1 如果田忌最慢的马比齐王最慢的马要快,那么一定要比赛
3.2 如果田忌最慢的马和齐王最慢的马一样快 ,我们就用田忌的慢马去消耗齐王的快马,田忌的慢马和齐王的快马有两种关系要么两者速度相等要么田忌的慢马比齐王的快马要慢
3.3如果田忌最慢的马比齐王最慢的马要慢,那反正谁也比不过,就和齐王最快的马去比
测试点:
8 1
1 9 8 8 8 4 3 2
11 8 8 8 8 4 3 2
答案:800
3
89 85 81
90 85 81 答案:200
3
2 3 5
3 4 4
答案:0
代码实现:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
const int N=1005;
int a[N];
int b[N];
void solve()
{
int ans=0;
int i=1;
int j=1;
int max_i=n;
int max_j=n;
while(n--)
{
if(a[max_i]>b[max_j])//田忌的最快的马比齐王最快的马要快
{
max_i--;
max_j--;
ans+=200;
}
else if(a[max_i]<b[max_j])//田忌最快的马比齐王最慢的马要慢
{
i++;
max_j--;
ans-=200;
}
else if(a[max_i]==b[max_j])//田忌最快的马和齐王最快的马一样快
{
if(a[i]>b[j])//田忌最慢的马比齐王最慢的马要快
{
i++;
j++;
ans+=200;
}
else if(a[i]==b[j])//田忌最慢的马和齐王最慢的马一样快,用慢马去消耗快马
{
if(a[i]<b[max_j])//田忌的慢马可能和齐王的快马相等或者比齐王的快马要慢
{
ans-=200;
}
max_j--;
i++;
}
else if(a[i]<b[j])//田忌最慢的马比齐王最慢的马还要慢,反正谁也比不过,和最快的去比
{
max_j--;
i++;
ans-=200;
}
}
}
cout<<ans<<endl;
}
int main()
{
while(cin>>n && 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+1+n);
sort(b+1,b+1+n);
solve();
}
return 0;
}