田忌赛马问题
描述
田忌和齐威王赛马,马的品质分为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;
}