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;
  }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值