描述
中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?
输入
第一行为一个正整数n (n <= 1000) ,表示双方马的数量。
第二行有N个整数表示田忌的马的速度。
第三行的N个整数为齐王的马的速度。
输出
仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。
样例输入
3
92 83 71
95 87 74
样例输出
200
这道题让我明白……要学好贪心,首先要有颗“贪心”
解析:
首先,从双方最弱的马开始比较:
- 如果田忌的马比齐王的马快,那使这两条马比赛(不赢白不赢)
- 如果田忌的马比齐王的马慢,就使田忌的这条最弱的和齐王最强的马比赛(反正都要输,不如输的有价值)
然后,如果遇到双方的马一样快的情况:
肯定怼掉啊,反正不输钱!恭喜你,掉坑了
这个时候后面的马先放一放,我们看前面:
- 如果田忌最强的马比齐王最强的马快,就使这两只比赛(双方强者的硬怼)
- 如果田忌最强的马比齐王最强的马慢,就使田忌目前最弱的把齐王最强的浪掉
这样虽然不能保证不输钱,但结果一定是最优的
代码如下:
#include<stdio.h> #include<algorithm> using namespace std; int a[2010],b[2010]; int ans; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=1;i<=n;++i) scanf("%d",&b[i]); sort(a+1,a+1+n); sort(b+1,b+1+n); int ra=n,rb=n,la=1,lb=1; while(lb<=rb) { if(a[la]>b[lb]) { la++,lb++; ans++; } else if(a[la]<b[lb]) { rb--,ans--; la++; } else if(a[la]==b[lb]) { if(a[ra]>b[rb]) { ans++; ra--,rb--; } else { if(a[la]<b[rb]) ans--; la++,rb--; } } } printf("%d",ans*200); return 0; }