典型的贪心算法~ (田忌赛马 )

 1. 田忌赛马

 典型的贪心算法~~自己木有考虑到贪心的第二步导致wa了好多次

算法分析 

Problem Description:

给出2N组数据,分别表示田忌和齐威王的N匹马的速度,没进行一场比赛(每组数据共N场场赛),若能分出胜负,则输的一方要给赢的一方200Y¥(银元),求田忌以怎样的策略才能赚取最多的老婆本。

Solution:这题有多种解体思路,DP,二分图最大匹配算法等,这里给出的是比较容易理解的贪心算法,具体思路如下:

先将田忌跟齐王的马的速度数组进行一次冒泡排序

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

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

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

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

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

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

注意这两种 数据

3

1 2 3

92 83 71 tian 第一步 tian1对king1 转到2 贪心的第一次,

95 92 74 king 第二步tian1对king2 转到3.1 (贪心的第二次 保留tian的快马 )

第三步 只剩下一种选择了~~3 92 83 70 92 91 60

*********代码

#include<stdio.h>   
#include<iostream>   
#include<algorithm>   
using namespace std;  
int a[3000],b[3000];  
int cmp(int a,int b)  
{  
  return a>b;      
}  
int main()  
{  
   int i,n,j,sum,k,f,ji;  
   while( scanf("%d",&n) && n!=0 )  
   {  
      for(i=0;i<n;i++)  
        scanf("%d",&a[i]);    
      for(i=0;i<n;i++)        
        scanf("%d",&b[i]);  
      sort(a,a+n,cmp);     
      sort(b,b+n,cmp);  
      ji=0;    //   记录 king  比赛用的马  循环跳出的判定条件    
      i=j=sum=0;  
      k=n-1;  
      f=n-1;  
      while(1)  
      {             
          if(ji==n)   break;   //   king  的马全部比完后跳出    
          if(b[j]>a[i]) {   sum-=200;j++;k--;ji++; continue;}  //如果king的比tian的快马快 用tian的慢马对king的快马    
          if(b[j]==a[i]){                                       //如果相等    
                            if(b[f]<a[k]){f--;k--;sum+=200;ji++;continue;} //看两人的慢马 tian的慢马比king的慢马快则比    
                            if(b[j]>a[k]){sum-=200;k--;j++;ji++;}  
                            else {k--;j++;ji++;}  
                            continue;  
                        }  
          if(b[j]<a[i]){sum+=200;j++;i++;ji++;continue;}  //如果tian的比king的快马快 直接比    
      }            
      printf("%d\n",sum);      
   }  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值