田忌赛马 C++实现

/**
 * 田忌赛马问题
 * @author liule
 * (1)最快马。若田忌快,则使用田忌最快马对齐王最快马
 * (2)最快马。若齐王快,则使用田忌最慢马对齐王最快马
 * (3)最快马。两者同速:
 *  ①:最慢马田忌快,则使用田忌最慢马对齐王最慢马。
 *  ②:否则,则使用田忌最慢马对齐王最快马。
 *  以上每一步选择均是最优,因此结果最优。                     
 */

#include<iostream>
#include<algorithm>

using namespace std;

const int MAXN(1000);     //最多1000只马
int n, money, l1, l2, r1, r2;

/**n:the number of horses;
 * l1:the lowest of tianji's horse
 * l2:the lowest of Qi's horse
 * r1:the best of tianji's horse
 * r2:the best of Qi's horse
 */

int a[MAXN], b[MAXN];

int main()
{
    cin >> n;
    while(n!=0)
    {
        for (int i = 0; i < n;++i)
        {
            cin >> a[i];    // horses of tianji
        }
        for (int i = 0; i < n;++i)
        {
            cin >> b[i];    // horses of kingQi
        }

        sort(a, a + n);     //sort
        sort(b, b + n);     //sort

        money = 0;
        l1 = l2 = 0;
        r1 = r2 = n - 1;

        while(l1 <= r1)
        {
            if(a[r1]>b[r2])   //最快马。若田忌快,则使用田忌最快马对齐王最快马
            {
                money += 200;
                --r1;
                --r2;
            }else if(a[r1] < b[r2])   //最快马。若齐王快,则使用田忌最慢马对齐王最快马
            {
                money -= 200;
                ++l1;
                --r2;
            }
            else    //最快马。两者同速:
            {
                if(a[l1]>b[l2])  //最慢马田忌快,则使用田忌最慢马对齐王最慢马。
                {
                    money += 200;
                    ++l1;
                    ++l2;
                }
                else
                {
                    if(a[l1] < b[r2])    //否则,则使用田忌最慢马对齐王最快马。
                    {
                        money -= 200;
                    }
                    ++l1;
                    --r2;
                }  
            }
        }
        cout << money << endl;
        cin >> n;
    }
    return (0);
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值