田忌赛马问题

 代码展示:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include <algorithm>
using namespace std;
int HanShu(int tiJi[], int king[], int n);
int cmp(int a, int b);
//只需要从大到小跟对面从大到小的比,能比过立刻换下一个比
int HanShu(int tiJi[], int king[], int n)
{
    int lefta = 0, righta = n - 1;  //田忌的马的编号
    int leftb = 0, rightb = n - 1;  //齐王的马的编号
    int win = 0; //能赢几次
    int fail = 0; //输几次
    while (lefta <= righta)
    {
        //田最快的马比王最快的马快,就直接比
        if (tiJi[lefta] > king[leftb])
        {
            win++;
            lefta++; leftb++;
        }
        //慢,就用跑的最慢的马跟王最快的马比
        else if (tiJi[lefta] < king[leftb])
        {
            fail++;
            righta--; leftb++;
        }
        //平局就比较俩人最慢的马谁慢
        else
        {
            //田最慢的马比王最慢的马跑得快,就比较最慢的
            if (tiJi[righta] > king[rightb])
            {
                righta--; rightb--;
                win++;
            }
            //否则用田最慢的马去比王最快的马
	/*极端情况 田忌:90 90 90 90
	齐王:90 90 90 90此时所有马匹速度相同
	不比赛win和fail都为0,,奖金为0*/
            else
            {
                if (tiJi[righta] < king[leftb])
                    fail++;
                righta--; leftb++;

            }

        }
    }
    return (win - fail) * 200; // 赢一小局获得200,输一小局输掉200
}

int cmp(int a, int b)
{
    return a > b;
}

int main()
{
    int n;

    while (cin >> n && n != 0)
    {
        int *tiJi=new int [n];//田忌赛马数组
        int *king=new int [n];//国王赛马数组
        //俩个for循环输入马匹速度
        for (int i = 0; i < n; i++)
        {
            cin >> tiJi[i];
        }
        for (int i = 0; i < n; i++)
        {
            cin >> king[i];
        }
        //从大到小排列
		//cmp自定义函数作为参数传入sort函数
        sort(tiJi, tiJi + n, cmp);
        sort(king, king + n, cmp);

        cout << HanShu(tiJi, king, n) << endl;

    }

    return 0;
}

实验结果:

输出结果为4行,第一行为马的个数,第二行为田忌每匹马的速度,第三行为国王每匹马的速度,第四行为田忌所获得奖金数目

田忌最快的马比国王最快的马慢

田忌最快的马和国王最快的马一样快

田忌最快的马比国王最快的马快

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值