ACM---贪心----hdoj 1052

http://acm.hdu.edu.cn/showproblem.php?pid=1052

题目大意:田忌赛马问题

(这类要从数组头尾比较的问题,一般设置两个变量记录头尾下标的变化)

分析:

1、如果田忌最快的马比齐王最快的马快,则比之

2、如果田忌最快的马比齐王最快的马慢,则用田最慢的马跟齐最快的马比  //这是贪心的第一步

3、如果田忌最快的马的速度与齐威王最快的马速度相等

3.1、如果田忌最慢的比齐威王最慢的快,则比之                         //这是贪心的第二步

//这里我一直写错,就是如果田忌最慢的不比齐威王最慢的快,那么我们要额外去判断一下王的最快的马和田忌最慢马的情况。为什么呢?因为,当两最慢马相等时,田忌最慢马耶可能和王最快马是一样的,那么就不会有损失。

3.2、如果田忌最慢的比齐威王最慢的慢,田忌慢VS齐王快

3.3、田忌最慢的与齐威王最慢的相等,田忌慢VS齐王快.

#include<iostream>
using namespace std;
#include<cstring>
#include<cmath> 
#include<algorithm>
#include<set>
int main()
{
	int n,sum,j1,k1,j2,k2,m;;
	int a[1005],b[1005];
	while(cin>>n&&n){
		for(int i=0;i<n;i++)
			cin>>a[i];
		sort(a,a+n,greater<int>());
		for(int i=0;i<n;i++)
			cin>>b[i];
		sort(b,b+n,greater<int>());
		m=sum=0;
		j1=k1=0;    //每个数组设置头尾两个下标
		j2=k2=n-1;
		while(1){
			if(m==n)	break;
			if(a[j1]>b[k1]){
				sum+=200;
				m++;
				j1++;k1++;
				continue;
			}
			if(a[j1]<b[k1]){
				sum-=200;
				m++;
				k1++;j2--;
				continue;
			}
			if(a[j1]==b[k1]){
				if(a[j2]>b[k2]){
					sum+=200;
					m++;
					j2--;k2--;
					continue;
				}
				if(b[k1]>a[j2]){    //注意这里if里面的比较
					sum-=200;
					m++;
					j2--;k1++;
				}else{
					m++;
					j2--;k1++;
				}
				continue;
			}
		}
	printf("%d\n",sum);
}
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_40725780/article/details/81260405