田忌赛马问题

田忌赛马问题

描述

田忌和齐威王赛马,马的品质分为S、A、B、C、D五等,S最强,D最弱。田忌和齐威王事先布置了马匹出场顺序,每轮比赛按顺序各出一匹马。如果马的品质相同,则田忌的马仍会稍逊一筹;如果马的等级不同,则品质比较高的马获胜(S>A>B>C>D)。已知双方马匹的出场顺序,想知道田忌赢输各几场。
后来孙膑帮田忌偷看了齐威王的马匹出场顺序,帮田忌的马匹出场顺序做了最有利的调整,问这时候田忌赢输又各几场。

输入

一个正整数n,表示测试案例的数量。
每组案例包含两个长度相等的字符串,字符串里只会出现大写的S、A、B、C、D五种字符,第一个字符串表示田忌的马匹出场顺序中每匹马的品质,第二个字符串表示齐威王的。两个字符串之间用一个空格隔离。

这题主要用贪心求解只去求田忌赢的情况把能赢的都赢到手

#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
void tr(string a, int b[])
{
    for (int i = 0; i < a.length(); i++)
    {
        if (a[i] == 'S')b[i] = 100;
        else if (a[i] == 'A')b[i] = 90;
        else if (a[i] == 'B')b[i] = 80;
        else if (a[i] == 'C')b[i] = 70;
        else b[i] = 60;
   }
    
}//将字符串转为数字方便排序
bool f(int a, int b)
{
    return a > b;
}
int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        int la, lb, ra, rb;
        string a,b;//a是田忌,b是齐威王
        cin >> a>>b;
        int len = a.length();
        int* t = new int[len];
        int* q = new int[len];
        tr(a, t);
        tr(b, q);
        int w = 0;//w记录田忌赢的数量
        sort(t, t + len,f); sort(q, q + len,f);//从大到小排序求片便求最多能赢多少把
        la = 0, lb = 0, ra = len - 1, rb = len - 1;
        //la表示田忌的指针,lb表示齐威王的指向头的指针
        //ra,rb表示指向尾的指针
        for (int i = 0; i < len; i++)
        {
            if (t[la] > q[lb])//若田忌快的马能赢
            {
                w++;
                la++;
                lb++;
            }
            else if (t[ra] > q[rb])//否则比较双方最慢的马 能赢则双方左指针右移
            {
                w++;
                ra--;
                rb--;
            }
            else if (t[ra] < q[lb])//否则只能浪费最慢的马和齐王的快马比 
            {
                lb++;
                ra--;
            }
        }
        cout << w << " " << len - w << endl;
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值