程序设计与算法(二)第11周测验

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

分析

因为在贪心得章节,采用贪心算法来解这道题目。这道题目得情况数很多,不过都遵循一个规则,在能赢的情况下,尽量赢,不能赢则消耗掉齐王最快的马,保留田忌的快马。分别是:

  1. 如果田忌最快的马比齐王最快的马快,则安排比赛。
  2. 如果田忌最快的马比齐王最快的马慢,则安排田忌最慢的马跟齐王最快的马比赛。
  3. 如果田忌最快得马与齐王最快得马一样快:
    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值