题目
样例输入
3
DongDong AAA109
ZJM 678910
Hrz 678910
样例输出
Hrz
ZJM
DongDong
思路
暴力算...
首先用map存储不同的牌面和对应的数字,就是10比较麻烦,可以这样处理:因为1输入作'A',因此当输入中有1时只可能是10。所以读到1的时候,转换为10,并跳过一位。
为每个人建立结构体,存储name、type以及多level的分数。通过多关键字排名来计算。
再处理牌面的时候,统计出现了什么数字的牌面,以及每一张牌面的个数。
然后从type9这种优先级高的开始暴力处理就成了...
代码
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
map<char, int> poker;
struct score
{
string name;
int type;
int scorr1 = 0;
int scorr2 = 0;
int scorr3 = 0;
bool operator<(const struct score &p)const
{
if (type != p.type)
return type > p.type;
if (scorr1 != p.scorr1)
return scorr1 > p.scorr1;
if (scorr2 != p.scorr2)
return scorr2 > p.scorr2;
if (scorr3 != p.scorr3)
return scorr3 > p.scorr3;
return name < p.name;
}
}score[100010];
struct p
{
int poker;
int num;
p(int poker = 14, int num = 0)
{
this->poker = poker;
this->num = num;
}
bool operator<(const struct p &a)const
{
return poker < a.poker;
}
};
int main()
{
poker['A'] = 1;
poker['2'] = 2;
poker['3'] = 3;
poker['4'] = 4;
poker['5'] = 5;
poker['6'] = 6;
poker['7'] = 7;
poker['8'] = 8;
poker['9'] = 9;
poker['J'] = 11;
poker['Q'] = 12;
poker['K'] = 13;
int n;
cin >> n;
string str;
for (int i = 0; i < n; i++)
{
cin >> score[i].name;
cin >> str;
struct p po[5];
int k = 0;
int nn = 0;
for (int j = 0; j < 5; j++, k++)
{
int poo;
if (str[k] == '1')
{
k++;
poo = 10;
}
else poo = poker[str[k]];
//cout << "poo:" << poo << endl;
for (int v = 0; v < 5; v++)
{
if (po[v].poker == poo)
{
po[v].num++;
break;
}
else if (po[v].poker == 14)
{
po[v].poker = poo;
po[v].num++;
nn++;
break;
}
}
sort(po, po + nn);
}
/*
for (int j = 0; j < 5; j++)
{
cout << "po" << j << ": ";
cout << "牌面:" << po[j].poker << " 数目:" << po[j].num << endl;
}
cout << "nn:" << nn <<endl;
*/
if (nn == 5 && po[0].poker == 1 && po[1].poker == 10 && po[4].poker == 13)//龙顺
score[i].type = 8;
else if (nn == 5 && po[4].poker - po[0].poker == 4)//顺子
{
score[i].type = 7;
score[i].scorr1 = po[4].poker;
}
else if (nn == 2 && (po[0].num == 4 || po[1].num == 4))//炸弹
{
score[i].type = 6;
if (po[0].num == 4)
{
//cout << "case1 " <<po[0].num<< endl;
score[i].scorr1 = po[0].poker;
score[i].scorr2 = po[1].poker;
}
else
{
//cout << "case2" << po[0].num << endl;
score[i].scorr2 = po[0].poker;
score[i].scorr1 = po[1].poker;
}
}
else if (nn == 2 && (po[0].num == 3 || po[1].num == 3))//三带二
{
score[i].type = 5;
if (po[0].num == 3)
{
score[i].scorr1 = po[0].poker;
score[i].scorr2 = po[1].poker;
}
else
{
score[i].scorr2 = po[0].poker;
score[i].scorr1 = po[1].poker;
}
}
else if (nn == 3 && (po[0].num == 3 || po[1].num == 3 || po[2].num == 3))
{//三个
score[i].type = 4;
if (po[0].num == 3)
{
score[i].scorr1 = po[0].poker;
score[i].scorr2 = po[1].poker + po[2].poker;
}
else if (po[1].num == 3)
{
score[i].scorr1 = po[1].poker;
score[i].scorr2 = po[0].poker + po[2].poker;
}
else
{
score[i].scorr1 = po[2].poker;
score[i].scorr2 = po[0].poker + po[1].poker;
}
}
else if (nn == 3 && ((po[0].num == 2 && po[1].num == 2) || (po[0].num == 2 && po[2].num == 2) ||
(po[1].num == 2 && po[2].num == 2)))
{//两对
score[i].type = 3;
if (po[0].num == 2 && po[1].num == 2)
{
score[i].scorr1 = max(po[0].poker, po[1].poker);
score[i].scorr2 = min(po[0].poker, po[1].poker);
score[i].scorr3 = po[2].poker;
}
else if (po[0].num == 2 && po[2].num == 2)
{
score[i].scorr1 = max(po[0].poker, po[2].poker);
score[i].scorr2 = min(po[0].poker, po[2].poker);
score[i].scorr3 = po[1].poker;
}
else
{
score[i].scorr1 = max(po[1].poker, po[2].poker);
score[i].scorr2 = min(po[1].poker, po[2].poker);
score[i].scorr3 = po[0].poker;
}
}
else if (nn = 4 && (po[0].num == 2 || po[1].num == 2 || po[2].num == 2 || po[3].num == 2))
{//对
score[i].type = 2;
if (po[0].num == 2)
{
score[i].scorr1 = po[0].poker;
score[i].scorr2 = po[1].poker + po[2].poker + po[3].poker;
}
else if (po[1].num == 2)
{
score[i].scorr1 = po[1].poker;
score[i].scorr2 = po[0].poker + po[2].poker + po[3].poker;
}
else if (po[2].num == 2)
{
score[i].scorr1 = po[2].poker;
score[i].scorr2 = po[0].poker + po[1].poker + po[3].poker;
}
else
{
score[i].scorr1 = po[3].poker;
score[i].scorr2 = po[0].poker + po[1].poker + po[2].poker;
}
}
else
{
score[i].type = 1;
score[i].scorr1 = po[0].poker + po[1].poker + po[2].poker + po[3].poker + po[4].poker;
}
}
sort(score, score + n);
for (int i = 0; i < n; i++)
cout << score[i].name << endl;
system("Pause");
}