描述
中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?
输入格式
第一行为一个正整数n (n <= 1000) ,表示双方马的数量。
第二行有N个整数表示田忌的马的速度。
第三行的N个整数为齐王的马的速度。
第二行有N个整数表示田忌的马的速度。
第三行的N个整数为齐王的马的速度。
输出格式
仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。
测试样例1
输入
3
92 83 71
95 87 74
输出
200
题解:贪心
1、让田忌跑的最慢的马和齐王最慢的马比较,若田忌的快,田忌得一分;
2、若田忌最慢的马和齐王最慢的相等时,比较田忌最快的马和齐王最快的马,若田忌最快的马的速度大于齐王的,
田忌得一分;若田忌最快的马速度小于齐王最快的,让田忌最慢的马和齐王最快的马比较,田忌输一次;
3、若田忌最快的马和齐王最快的马速度相等,进行贪心讨论。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int u[1005],v[1005];
int main(){
int n;
while(cin >> n){
if(n==0) break;
for(int i=0;i<n;i++)
cin >> u[i];
for(int i=0;i<n;i++)
cin >> v[i];
sort(u,u+n);
sort(v,v+n);
int a=0,b=0;
int c=n-1,d=n-1;
int t=0;
for(;a<=c;){
if(u[a]>v[b]){
t++;
a++;
b++;
}
else if(u[a]==v[b]){
if(u[c]>v[d]){
t++;
c--;
d--;
}
else{
if(u[a]>v[d])
t++;
else if(u[a]<v[d])
t--;
a++;
d--;
}
}
else {
t--;
a++;d--;
}
}
cout << 200*t << endl;
}
return 0;
}