HDU ACM 1052 Tian Ji -- The Horse Racing 贪心

#include<iostream>
#include<algorithm>
using namespace std;

int main()                     //贪心
{
	int n,money,i,j,i1,j1;
	int a[1005],b[1005];

	while(cin>>n && n)
	{
		for(i=0;i<n;i++)
			cin>>a[i];
		for(i=0;i<n;i++)
			cin>>b[i];

		sort(a,a+n);    //排序田忌
		sort(b,b+n);    //排序齐威王
		money=0;
		for(i=0,i1=0,j=n-1,j1=n-1;i1<=j1&&i<=j;)
			if(a[i]>b[i1])                 //田忌最慢比齐王最慢快
				i++,i1++,money++;
			else if(a[i]<b[i1])            //田忌最慢比齐王最慢慢
				i++,j1--,money--;
			else                      //田忌最慢和齐王最慢相等
			{
				if(a[j]>b[j1])       //田忌最快比齐王最快快
					j--,j1--,money++;
				else if(a[j]<b[j1]) //田忌最快比齐王最快慢
					i++,j1--,money--;
				else                 //下面的最快相等,最慢也相等
				{
					if(a[i]<b[j1])   //田忌最慢比齐王最快慢
						i++,j1--,money--;
					else                 //平局
						i++,j1--;
				}
			}
		cout<<money*200<<endl;
	}
    return 0;
}

下面参考自:http://www.cnblogs.com/Action-/archive/2012/07/03/2574744.html

算法可以用DP,或者给每匹马连线赋权变为二分图最佳匹配,还有就是贪心了。

1.当田忌最慢的马比齐王最慢的马快,赢一场先

2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场

3.当田忌最快的马比齐王最快的马快时,赢一场先。

4.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场。

5.当田忌最快的马和齐王最快的马相等时,拿最慢的马来和齐王最快的马比.

田忌赛马贪心的正确性证明。

先说简单状况下的证明:

1.当田忌最慢的马比齐王最慢的马快,赢一场先。因为始终要赢齐王最慢的马,不如用最没用的马来赢它。

2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场。因为田忌最慢的马始终要输的,不如用它来消耗齐王最有用的马。

3.当田忌最慢的和齐王最慢的马慢相等时,分4和5讨论。

4.当田忌最快的马比齐王最快的马快时,赢一场先。因为最快的马的用途就是来赢别人快的马,别人慢的马什么马都能赢。

5.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场,因为反正要输一场,不如拿最没用的马输。

6.当田忌最快的马和齐王最快的马相等时,这就要展开讨论了,贪心方法是,拿最慢的马来和齐王最快的马比.

前面的证明像公理样的,大家一看都能认同的,没有异议的,就不细说了。

证明:田忌最快的马和齐王最快的马相等时拿最慢的马来和齐王最快的马比有最优解。

1)假设他们有n匹马,看n=2的时候.

a1 a2

b1 b2

因为 田忌最快的马和齐王最快的马相等 所以a1=b1,a2=b2 所以这种情况有2种比赛方式,易得这两种方式得分相等。

2)当数列a和数列b全部相等等时(a1=b1,a2=b2...an=bn),显然最慢的马来和齐王最快的马比有最优解,可以赢n-1长,输1场,找不到更好的方

法了。

3)当数列a和数列b元素全部相等时(a1=b1=a2=b2...=an=bn),无法赢也不输。

现在假设n匹马时拿最慢的马来和齐王最快的马比有最优解,证明有n+1匹马时拿最慢的马来和齐王最快的马比也有最优解。

数列

a1 a2 a3 a4...an an+1

b1 b2 b3 b4...bn bn+1

其中ai>=ai-1,bi>=bi-1

数列a和数列b不全部相等时,拿最慢的马来和齐王最快的马比数列得到数列

(a1) a2 a3 a4...an an+1

b1 b2 b3 b4...bn (bn+1)

分4种情况讨论

1.b1=b2,an=an+1

则有

a2 a3 a4...an

b2 b3 b4...bn

其中a2>=a1,a1=b1,b1=b2,得a2>=b2(此后这种大小关系不再论述),an>=bn.

此时若a2=b1,根据归纳假设,有最优解,否则a2>根据前面“公理”论证有最优解。

当且仅当a数列,b数列元素全部相等时有an+1=b1,已证得,所以an+1>b1,赢回最慢的马来和齐王最快的马比输的那一场。

2.b1<=b2,an=an+1

交换 b1,b2的位置,

数列

(a1) a2 a3 a4...an an+1

b2 b1 b3 b4...bn (bn+1)

此时 a2>=a1,an>=bn,

对于子表

a2 a3 a4...an

b1 b3 b4...bn

根据前面“公理”或归纳假设,有最优解。

an+1>=b2, 当且仅当b2=b3=b4=..=bn+1时有an+1=b2,这种情况,a中其它元素<=b1,b2,b3,b4..bn,对于这部分来说,能赢 x盘(x<=n),假如不拿最慢的马来和齐王最快的马比则拿最快的马来和齐王最快的马比,此时平一盘,能赢x-1盘,而拿最慢的马来和齐王最快的马 比,输一盘能赢x盘,总的来说,还是X这个数,没有亏。

3.b1=b2,an<=an+1

4.b1<=b2,an<=an+1证明方法类似,不再重复。

以证得当有n+1匹马的时候,田忌和齐王最快最慢的马速度相等时,拿最慢的马来和齐王最快的马比有最优解,已知当n=2时成立,所以对于n>2且为整数(废话,马的只数当然是整数)时也成立。当n=1时....这个似乎不用讨论.

时间: 2024-11-07 10:09:44

HDU ACM 1052 Tian Ji -- The Horse Racing 贪心的相关文章

HDU 1052 Tian Ji -- The Horse Racing (贪心)

题意:田忌赛马,问你田忌最多能赢多少银子. 析:贪心,绝对贪心的题,贪心策略是: 1.如果田忌当前的最快的马能追上齐王的,那么就直接赢一局 2.如果田忌当前的最慢的马能追上齐王的,那么就直接赢一局 3.如果田忌当前的最慢的马不能超过齐王的,那么就输一局,并把齐王最快的干掉 通过以上策略,就是田忌赢的最多. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #incl

HDU 1052 Tian Ji -- The Horse Racing(贪心)(2004 Asia Regional Shanghai)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1052 Problem Description Here is a famous story in Chinese history. "That was about 2300 years ago. General Tian Ji was a high official in the country Qi. He likes to play horse racing with the king and

杭州电 1052 Tian Ji -- The Horse Racing(贪婪)

http://acm.hdu.edu.cn/showproblem.php? pid=1052 Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18058    Accepted Submission(s): 5239 Problem Description Here is a f

杭电 1052 Tian Ji -- The Horse Racing(贪心)

http://acm.hdu.edu.cn/showproblem.php?pid=1052 Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18058    Accepted Submission(s): 5239 Problem Description Here is a fa

hdoj 1052 Tian Ji -- The Horse Racing【田忌赛马】 【贪心】

思路:先按从小到大排序, 然后从最快的開始比(如果i, j 是最慢的一端, flag1, flag2是最快的一端 ),田的最快的大于king的 则比較,如果等于然后推断,有三种情况: 一:大于则比較,二等于在推断田的最慢的是不是比king的最快的慢,三小于则与king的最快的比較: Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe

HDU 1052 Tian Ji -- The Horse Racing【贪心在动态规划中的运用】

算法分析: 这个问题很显然可以转化成一个二分图最佳匹配的问题.把田忌的马放左边,把齐王的马放右边.田忌的马A和齐王的B之间,如果田忌的马胜,则连一条权为200的边:如果平局,则连一条权为0的边:如果输,则连一条权为-200的边. 然而我们知道,二分图的最佳匹配算法的复杂度很高,无法满足N=2000的要求. 我们不妨用贪心思想来分析一下问题.因为田忌掌握有比赛的“主动权”,他总是根据齐王所出的马来分配自己的马,所以这里不妨认为齐王的出马顺序是按马的速度从高到低出的.由这样的假设,我们归纳出如下贪心

hdu 1052 Tian Ji -- The Horse Racing 可恶的贪心-------也算是经典贪心题吧,对于一般人来说,不看题解,应该很难做出来吧

Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20051    Accepted Submission(s): 5869 Problem Description Here is a famous story in Chinese history. "That was about

HDU 1052.Tian Ji -- The Horse Racing【很好的贪心】【8月27】

Tian Ji -- The Horse Racing Problem Description Here is a famous story in Chinese history. "That was about 2300 years ago. General Tian Ji was a high official in the country Qi. He likes to play horse racing with the king and others." "Both

HDU1052 Tian Ji -- The Horse Racing 贪心

Tian Ji -- The Horse Racing Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1052 Description Here is a famous story in Chinese history. "That was about 2300 years ago. General Tian Ji was a