贪心算法—Problem C

贪心算法—Problem C

题意

田忌赛马的故事要求用贪心算法求出田忌能获得最多钱数。

解题思路

输入田忌和国王的马后,把它们的速度升序排列,然后开始比较。首先,比较田忌的快马和国王的快马,如果田忌的快马快于国王的快马,则计数器累加,下标减少;反之,如果慢于国王的快马,则用田忌的最慢马和国王的最快马比(不用比肯定输)计数器减少,对应的下标分别增加和减少。还有一种相等的情况,碰到这种情况,转向比较田忌的慢马和齐王的慢马,若田忌的慢马快于齐王最慢马,计数器累加,下标增加;反之,计数器减少,下标做相应变化。最后把计数器的数据乘200输出钱数。

感想

看似简单的题意,在第一次设计算法时,明明所给的测试数据无误,但还是WA,找了半天也找不到bug,只好重新设计算法。

AC代码

#include<algorithm>

#include<iostream>

#include<cstring>

using namespace std;

 

int main()

{

       int  tian[1001], king[1001];

       int  n;

       while (cin>> n&&n!=0)

       {

              int i;

              int  count=0;

              memset(tian,0, sizeof(tian));

              memset(king,0, sizeof(king));

              for(i = 0; i < n; i++)

              {

                     cin>> tian[i];

              }

              for(i = 0; i < n; i++)

              {

                     cin>> king[i];

              }

              sort(&tian[0],&tian[n]);

              sort(&king[0],&king[n]);

              int  minT=0;

              int  minK=0;

              int  maxT=n-1;

              int  maxK=n-1;

              for(i=0;i<n;i++)

              {

                     if(tian[maxT]>king[maxK])

                     {

                            count++;

                            maxT--;

                            maxK--;

                     }

                     else  if(tian[maxT]<king[maxK])

                             {

                                   count--;

                                   minT++;

                                   maxK--;

                              }

                           else

                           {

                                  if(tian[minT]>king[minK]) 

                                    {

                                        count++; 

                                        minT++; 

                                        minK++; 

                                     } 

                                    else 

                                    {       

                                          if(tian[minT]<king[maxK])

                                          {

                                                 count--; 

                                                 minT++; 

                                                 maxK--;

                                          }

                                    }

                             }

             }

             cout<<count*200<<endl; 

       }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值