UVALive - 3266--贪心算法--田忌赛马

109 阅读1分钟

题意:

田忌赛马的故事,如果田忌赢了一把就赢200如果输了就-200,给出马匹的速度,求田忌的最大收益。

思路:

分三种大情况,

1.如果田忌的最快的马能赢国王最快的马那就比,

2.如果不能赢那就用田忌最慢的马去消耗国王最强的马,

3.最后一种大情况比较复杂,单独展开来说:如果田忌最快的与国王最快的马速度相等,别急着比快马。先比较田忌最慢的马和国王最慢的马,如果田忌慢马赢的了国王慢马,那就比,如果赢不了那就用这匹慢马去消耗国王的快马,这样田忌的快马就会保留下来。大概就是这样,一直比下去。还有一些细节讲不完,附上几组坑点,如果wa了,自己测试一下。

2 2 3 4

1 2 3 4

--------输出400

1 1 1 1

1 1 1 1

---------输出0

1 3 4 6

1 4 5 6

---------输出200

特别鸣谢jacknazi提供的样例。

#include <iostream>
#include<cstring>
#include<algorithm> 
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int tmax,tmin,gmax,gmin;
int tian[1005],guo[1005];
int main(int argc, char** argv) {
	int n;
	while(cin>>n&&n){
		int win=0;
		for(int i=0;i<n;i++)
			cin>>tian[i];
		sort(tian,tian+n);
		for(int i=0;i<n;i++)
			cin>>guo[i];
		sort(guo,guo+n);
		gmax=tmax=n-1;
		tmin=gmin=0;
		while(gmax>=gmin){
			if(tian[tmax]>guo[gmax]){
				tmax--;
				gmax--;
				win++;
			}
			else if(tian[tmax]<guo[gmax]){
				tmin++;
				gmax--;
				win--;
			}
			else{
				if(tian[tmin]>guo[gmin]){
					//tmax--;gmax--;
					tmin++;gmin++;
					win++;
				}
				else if(tian[tmin]==guo[gmin]){
						if(guo[gmax]==tian[tmin]){
							gmax--;tmin++;
						}
						else{
						gmax--;tmin++;
						win--;
						}
				}
				else{
						gmax--;tmin++;
						win--;
				}
			}
		}
		printf("%d\n",win*200);
		
	}
	return 0;
}


\