贪心 田忌赛马问题

问题描述

田忌和齐王各有n匹马,共有2n组数据,分别给出田忌和齐王n匹马的速度。
他们一共要进行n场比赛,若能分出胜负,则输的一方要给赢的一方200银元。若平局,则他们都不用给对方钱。每匹马都只能用一次。现在要你求出一个最佳策略,使田忌获得的钱数最多。并输出这个最大值。

Solution:

先对田忌和齐王的马的速度的数组进行一次从小到大的排序。
step1:我们先比较田忌最快的马和齐王最快的马的速度,若田忌获胜,就让这两匹马比赛。
step2:若田忌最快的马没有齐王最快的马的速度快,则用田忌最慢的马和齐王最快的马比赛。
step3:若田忌最快的马没有齐王最快的马的速度相等,则比较他们最慢的马的速度,这又分为两种情况。情况1:田忌最慢的马比齐王最慢的马的速度快,则让它们比赛。情况2:田忌最慢的马比齐王最慢的马的速度慢或者相等,则让田忌最慢的马和齐王最快的马比赛。

代码如下:

#include<iostream>
#include<algorithm>
#define MAX 100
using namespace std;

int n;//两人各有n匹马
int tian[MAX],qi[MAX];

int main(){
  cin>>n;
  for(int i=0;i<n;i++){//读入数据
    cin>>tian[i];
  }
  for(int i=0;i<n;i++){//读入数据
    cin>>qi[i];
  }
  sort(tian,tian+n);
  sort(qi,qi+n);//从小到大排序
  int i=0,j=0;//i和j分别表示田忌和齐王最慢的马
  int k1=n-1,k2=n-1;//k1和k2分别表示田忌和齐王最快的马

  int num=0;//计数已经比赛过的马的数量
  int money=0;//田忌获得的钱
  while(num<n){
    if(tian[k1]>qi[k2]){//若田忌的快马比齐王的快马快
        money+=200;
        k1--;
        k2--;
        num++;
        continue;
    }
    if(tian[k1]<qi[k2]){//若田忌的快马没有齐王的快马快
        money-=200;
        i++;
        k2--;
        num++;
        continue;
    }
    if(tian[k1]==qi[k2]){//若田忌的快马和齐王快马一样快
        if(tian[i]>qi[j]){//若田忌的慢马速度比齐王的慢马速度快,
                          //则他们的慢马比赛
            money+=200;
            i++;
            j++;
            num++;
            continue;
        }else{//若田忌的慢马速度比齐王的慢马速度慢或者相等
              //就让田忌的慢马和齐王最快的马比赛
            if(tian[i]<qi[k2]){money-=200;}
            i++;
            k2--;
            num++;
            continue;
        }
    }
  }

  cout<<money;
  return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/89540501