poj2287——Tian Ji -- The Horse Racing

题目大意:田忌和齐王赛马,各有N匹马,速度不同,赢了得200分,输了扣200分,问田忌最后赛马能得到的最高分是多少

输入:N

          田忌第i匹马的速度(共N个,空格间隔)

          齐王第i匹马的速度(共N个,空格间隔)

输出:最高得分

分析:贪心法。主要原则:尽可能的消耗齐王的快马,消耗自己的慢马。也就是说能赢尽量赢,赢不了就让田忌的最慢马去消耗齐王的最快马,同时判断一下这种消耗是平局还是输局就行了。

                      三条原则:1.田忌最快的马>齐王最快的马,直接比,赢了(消耗了齐王最快的马)

                                      2.田忌最快的马<齐王最快的马,让田忌最慢的马去和齐王最快的马比,反正都会输,消耗了自己的慢马干掉了齐王的快马,很划算

                                      3.田忌最快的马=齐王最快的马,此时需要比较一下田忌和齐王的最慢马

                                         (1)田忌最慢的马>齐王最慢的马,直接比,结果是一平一胜,获得最大收益

                                        (2)田忌最慢的马<=齐王最慢的马,让田忌最慢的马去和齐王最快的马比,消耗获益最大,最坏就是一胜一负,得分归0,和第2条原则可以归在一起写代码

代码:转载自https://blog.csdn.net/hatsune__miku/article/details/37923751

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[1200],b[1200];
bool vis[1200];
int main(){
	int n;
	while (~scanf("%d",&n),n){
		for (int i=1;i<=n;i++) scanf("%d",&a[i]);
		for (int i=1;i<=n;i++) scanf("%d",&b[i]);
		sort(a+1,a+1+n);
		sort(b+1,b+1+n);
		memset(vis,false,sizeof(vis));
		int ans=0,cnt=0;  //ans是田忌赢的次数,cnt是田忌输的次数
		int l=1,r=n;  //田忌的最慢和最快马
		int k=1,i=n;  //齐王的最慢和最快马
		while (k<=i&&l<=r){
			if (a[r]>b[i]) {  //田忌最快的马>齐王最快的马  胜
				ans++;
				r--;i--;
			}
			else {
				if (a[l]>b[k]){  //田忌最慢的马>齐王最慢的马  胜
					l++;k++;
					ans++;
				}
				else {  //自己的慢马去消耗齐王的快马
					if (a[l]<b[i]){  //自己的慢马比齐王的快马慢   输
						cnt++;l++;i--;
					}
					else {  //自己的慢马和齐王的快马一样快  平
						l++;i--;
					}					
				}
			}
		}
		printf("%d\n",(ans-cnt)*200);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/tzyshiwolaogongya/article/details/80978069