The Horse Racing
题目地址:http://bailian.openjudge.cn/practice/2287/
题目描述:
田忌赛马得故事大家都清楚,在这个问题里面,需要你充当田忌得角色。来分配你得每匹马与齐王王的对阵情况,或者最多的收益。本题中,赢得一次对决获得200块,输了一场扣除200元,平局则不扣也不赚。
输入
包含最多50组数据,每组数据包括一个n(<=1000)为马得数量。后面两行分别输入田忌得马跑得速度,和齐王马得速度。
输出
对于每个输入得case,你需要输出最多得收益,这里可能为负数。
样例
输入:
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
输出:
200
0
0
分析
因为在贪心得章节,采用贪心算法来解这道题目。这道题目得情况数很多,不过都遵循一个规则,在能赢的情况下,尽量赢,不能赢则消耗掉齐王最快的马,保留田忌的快马。分别是:
- 如果田忌最快的马比齐王最快的马快,则安排比赛。
- 如果田忌最快的马比齐王最快的马慢,则安排田忌最慢的马跟齐王最快的马比赛。
- 如果田忌最快得马与齐王最快得马一样快:
3-1. 如果田忌最慢的比齐王最慢的快,安排田忌最慢的跟齐王最慢的比赛。
3-2. 如果田忌最慢的比齐王最慢的慢,安排田忌最慢的跟齐王最快的比赛。
3-3. 如果田忌最慢的与齐王最慢的相等,安排田忌最慢的跟齐王最快的比赛。
AC
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<fstream>
using namespace std;
const int MAX = 1010;
int Tian[MAX];
int Qi[MAX];
int N;
int main()
{
int i;
while (cin >> N&&N != 0)
{
int Money = 0;
int Horse;
for (i = 0; i < N; ++i)
{
cin >> Tian[i];
}
for (i = 0; i < N; ++i)
{
cin >> Qi[i];
}
/*
遴选过程。
*/
sort(Qi, Qi + N);
sort(Tian, Tian + N);
int Head_Tian = 0;
int Head_King = 0;
int Rear_Tian = N - 1;
int Rear_King = N - 1;
for (i = 0; i<N; ++i)
{
Horse = Tian[Rear_Tian];
int KingHorse = Qi[Rear_King];
//一、田忌最快的马比齐王最快的快,那么直接用田忌最快的马去赢齐王最快的马。
if (Horse > KingHorse)
{
Money += 200;
Rear_King--;
Rear_Tian--;
}
//二、田忌最快的马比齐王最快的慢,那么用田忌最慢的马去输齐王最快的马。
else if (Horse < KingHorse)
{
Money -= 200;
Rear_King--;
Head_Tian++;
}
/*三、
3.1、如果田忌最慢的比齐威王最慢的快,则比之
3.2、如果田忌最慢的比齐威王最慢的慢,田忌慢VS齐王快
3.3、田忌最慢的与齐威王最慢的相等,田忌慢VS齐王快*/
else
{
if (Tian[Head_Tian] > Qi[Head_King])
{
Money += 200;
Head_Tian++;
Head_King++;
}
else
{
if (Tian[Head_Tian] < Qi[Rear_King])
{
Money -= 200;
Head_Tian++;
Rear_King--;
}
else if (Tian[Head_Tian] == Qi[Rear_King])
{
Rear_King--;
Head_Tian++;
}
}
}
}
cout << Money << endl;
}
return 0;
}
参考
https://blog.csdn.net/worldmakewayfordream/article/details/8042233?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1