贪心算法之田忌赛马

贪心策略如下:

如果田忌最快的马比齐王最快的马快

则田忌最快的马必定胜一场,最优策略是消耗掉齐王最快的马。

如果田忌最快的马比齐王最快的马慢

则齐王最快的马必定胜一场,最优策略是用田忌最慢的马去消耗齐王最快的马

如果田忌最快的马与齐王最快的马速度相同,则分为以下两个情形

1.田忌最慢的马比齐王最慢的马快

则齐王最慢的马必定输一场,最优策略是用田忌最慢的马去消耗齐王最慢的马

2.田忌最慢的马小于等于齐王最慢的马

此时田忌最慢的马必定不会赢一场,齐王最快的马必定不会输一场,则最优策略是用田忌最慢的马去消耗齐王最快的马


代码思路:用数组表示队列,维护头尾指针即可

#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <memory>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
int n;
int tianh[1005];
int qih[1005];
int main()
{
    while(cin >> n,n)
    {
        memset(tianh,0,sizeof(tianh));
        memset(qih,0,sizeof(qih));
        for(int i=0; i<n; i++)
            cin >> tianh[i];
        for(int i=0; i<n; i++)
            cin >> qih[i];
        int qhead = 0,qtail = n-1,thead=0,ttail=n-1;
        int money = 0;
        sort(tianh,tianh+n);
        sort(qih,qih+n);
        while(qhead<=qtail)
        {
            if(tianh[ttail] > qih[qtail])
            {
                money+=200;
                qtail--;
                ttail--;
            }
            else if(tianh[ttail] < qih[qtail])
            {
                money-=200;
                qtail--;
                thead++;
            }
            else
            {
                if(tianh[thead]>qih[qhead])
                {
                    money+=200;
                    thead++;
                    qhead++;
                }
                else
                {
                    if(tianh[thead]<qih[qtail])
                        money-=200;
                    thead++;
                    qtail--;
                }
            }
        }
        cout<<money<<endl;
    }
    return 0;
}

阅读更多
个人分类: 贪心
上一篇贪心之建立雷达
下一篇贪心算法之钓鱼
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭