1. 程式人生 > >3266--貪心演算法--田忌賽馬

3266--貪心演算法--田忌賽馬

題意:

田忌賽馬的故事,如果田忌贏了一把就贏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;
}