hdu 1052 田忌赛马加强

背景:

由于前些天做了贪心的题目就准备刷点贪心看看,不过由于会长告诉我要以集训队培训为主,自学为辅,所以这周大概要集中精力看集训队的题了,都是杭电oj的,会先自己尝试ac,实在不行再去看解题报告,受到会长大神鼓励我一定要加油了微笑

学习:

其实这道题想了好久还是没有考虑周到,都是看了discuss里的数据才开始考虑特殊情况的,这道题是把贪心的思想用到了极致啊,太经典,太开心!哭

1.思路:把两个人的马按降序排序,(由于开始手写10分钟的快排超时了,就用了c++的sort,没想到忘了在参数列表添加一个cmp,调试半天,下次注意了!)然后主要核心是当田忌的最快马和国王的最快马相等时要不要直接打平的判断(我在这里有一个思维懒惰现象不管三七廿一直接比,导致考虑不周到,不能再这样了,这叫因小失去大。)这时应该看最慢马,若田忌的最慢马小于或等于国王的应该最慢马,反正它都是要输的就让它和国王的最快马比吧,若田忌的最慢马大于国王的最慢马则这两最慢马直接相比,因为国王的最慢马和谁比都会输,就拿田忌的最慢马来和它比吧,然后再循环继续判断最慢马。

2.充分理解了贪心思想,每一步都要贪,且要考虑所有情况。

#include<stdio.h>
#include<algorithm>
using namespace std;
int cmp(const int &a,const int &b);
  int cmp(const int&a,const int &b)
  {
  	if(a>b)
  	return 1;
  	else 
  	return 0;
  }
int tj[10001],gw[10001];

  int main(void)
  {
  	int n=0;
  	while(scanf("%d",&n)!=EOF&&n!=0)
  	{
  		for(int i=0;i<n;++i)
  		{
  			scanf("%d",&tj[i]);
  		}
  		for(int i=0;i<n;++i)
  		{
  			scanf("%d",&gw[i]);
  		}
  		sort(tj,tj+n,cmp);
  		sort(gw,gw+n,cmp);
  		int i=0,j=n-1,x=n-1,k=0,w=0,l=0;
  		while(i<=j)
  		{
  			if(tj[i]>gw[k])
  			{
  				++i;
  				++k;
  				++w;
  			}
  			else if(tj[i]==gw[k])
  			{
  				if(tj[j]>gw[x])
  				{
  					--j;
  					--x;
  					++w;
  				}
  				else if(tj[j]==gw[x])
  				{
  					if(tj[j]<gw[k])
  					{
  						--j;
  						++k;
  						++l;
  					}
  					else
  					{
  						break;
  					}
  				}
  				else
				  {
				  	--j;
				  	++k;
				  	++l;
				  }
				  
  			}
  			else
  			{
  					++k;
  					--j;
  					++l;
  			}
  		}
  		printf("%d\n",200*(w-l));
  	}
  	return 0;
  }


你可能感兴趣的:(贪心)