田忌赛马——贪心算法(附加别人写的动态规划)

来源:互联网 发布:js是什么防水材料 编辑:程序博客网 时间:2024/06/05 16:52

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

这道题看了好几天,也看了很多版本,今天终于真的懂了

贪心算法的思路:

首先建两个数组用来存放齐王和田忌的马速

排序马速

1如果田忌的快马比齐王的快,那么不论怎样都是赢的

2如果齐王的慢马比田忌的慢马慢,那么田忌用慢马和齐王的慢马比,肯定赢的

3如果慢马一样快,那么分下面的讨论:

4,在3的基础上,田忌的快马快,那么对阵齐王的快马肯定赢一场

5在3 的基础上,田忌的快马慢,那么不论怎样都会输一个,所以就拿最慢的和最快的比较

6快马相等,贪心的开始

//田忌赛马---贪心算法#include<stdio.h>#include<algorithm> using namespace std;int a[1001],b[1001];//定义两个数组a为田忌,b为齐王 int main(){int i,j,n,money=0,cnt=0;while(~scanf("%d",&n)&&n){for(i=0;i<n;i++){ //初始化两个数组 scanf("%d",&a[i]);}for(j=0;j<n;j++){scanf("%d",&b[j]);}sort(a,a+n);//默认升序 sort(b,b+n);intmaxnuma=n-1;intmaxnumb=n-1;intminnuma=0;intminnumb=0;while(cnt<n){if(a[maxnuma]>b[maxnumb]){money+=200;maxnuma--;maxnumb--;cnt++;}else if(a[maxnuma]<b[maxnumb]){money-=200;minnuma++;maxnumb--;cnt++;}else if(a[maxnuma==maxnumb]){maxnuma--;maxnumb--;cnt++;}else{if(a[minnuma]>b[minnumb]){money+=200;minnuma++;minnumb++;cnt++;}else if(a[minnuma]<b[maxnumb]){money-=200;minnuma++;maxnumb--;cnt++;}}}printf("%d\n",money);}return 0;}
http://blog.csdn.net/lawrencesgj/article/details/8001638

他用动规写了,他贴出的别人的贪心算法,中间有个问题,当测试数据为

2

20 20

20 20时,输出不为0

我看了一下好像是没有这块的比较,