wdnmd,补题一遍过了。
数不清的wa都是过去式,只留下无穷的遗憾。
传送门
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int N = 1e5+10;
class Player{
public:
string name;
string str;
int p[5];
int rank1, rank2, rank3, rank4;
Player(){
name = "";
str = "";
memset(p, 0, sizeof p);
rank1 = rank2 = rank3 = rank4 = 0;
}
friend istream& operator>> (istream& pin, Player& s){
pin >> s.name >> s.str;
int pos, cnt = 0;
while((pos=s.str.find("10")) != string::npos) {
s.str.erase(pos,2);
s.p[cnt++] = 10;
}
for(int i = 0; i < s.str.size(); i++){
if(s.str[i]=='A') s.p[cnt++] = 1;
else if(s.str[i]=='J') s.p[cnt++] = 11;
else if(s.str[i]=='Q') s.p[cnt++] = 12;
else if(s.str[i]=='K') s.p[cnt++] = 13;
else s.p[cnt++] = s.str[i] - '0';
}
sort(s.p, s.p+5);
if(s.p[0]==1&&s.p[1]==10&&s.p[2]==11&&s.p[3]==12&&s.p[4]==13) s.rank1 = 8, s.rank2 = s.rank3 = s.rank4 = 0;//王顺
else if(s.p[0]+1==s.p[1]&&s.p[1]+1==s.p[2]&&s.p[2]+1==s.p[3]&&s.p[3]+1==s.p[4]) s.rank1 = 7, s.rank2 =s.p[4], s.rank3 = s.rank4 = 0;//顺子
else if((s.p[0]==s.p[1]&&s.p[1]==s.p[2]&&s.p[2]==s.p[3])||(s.p[1]==s.p[2]&&s.p[2]==s.p[3]&&s.p[3]==s.p[4])){//四连
s.rank1 = 6, s.rank2 = s.p[2], s.rank3 = (s.p[0]==s.p[2])?s.p[4]:s.p[0], s.rank4 = 9;;
}
else if((s.p[0]==s.p[1] && s.p[2]==s.p[3] && s.p[3]==s.p[4] && s.p[0]!=s.p[4])||(s.p[0]==s.p[1] && s.p[1]==s.p[2] && s.p[3]==s.p[4] && s.p[0]!=s.p[4])){//三带二
s.rank1 = 5, s.rank2 = s.p[2], s.rank3 = (s.p[0]==s.p[2])?s.p[4]:s.p[0], s.rank4 = 0;
}
else if((s.p[0]==s.p[1]&&s.p[1]==s.p[2])||(s.p[1]==s.p[2]&&s.p[2]==s.p[3])||(s.p[2]==s.p[3]&&s.p[3]==s.p[4])){//三连
s.rank1 = 4, s.rank2 = s.p[2];
if(s.p[0]==s.p[1]&&s.p[1]==s.p[2]) s.rank3 = s.p[3]+s.p[4];
if(s.p[1]==s.p[2]&&s.p[2]==s.p[3]) s.rank3 = s.p[0]+s.p[4];
if(s.p[2]==s.p[3]&&s.p[3]==s.p[4]) s.rank3 = s.p[1]+s.p[0];
s.rank4 = 0;
}
else if((s.p[0]==s.p[1]&&s.p[2]==s.p[3])||(s.p[0]==s.p[1]&&s.p[3]==s.p[4])||(s.p[1]==s.p[2]&&s.p[3]==s.p[4])){//两对
s.rank1 = 3;
if(s.p[0]==s.p[1]&&s.p[2]==s.p[3]) s.rank2 = max(s.p[0], s.p[2]), s.rank3 = min(s.p[0], s.p[2]), s.rank4 = s.p[4];
if(s.p[0]==s.p[1]&&s.p[3]==s.p[4]) s.rank2 = max(s.p[0], s.p[3]), s.rank3 = min(s.p[0], s.p[3]), s.rank4 = s.p[2];
if(s.p[1]==s.p[2]&&s.p[3]==s.p[4]) s.rank2 = max(s.p[1], s.p[3]), s.rank3 = min(s.p[1], s.p[3]), s.rank4 = s.p[0];
}
else if(s.p[0]==s.p[1]||s.p[1]==s.p[2]||s.p[2]==s.p[3]||s.p[3]==s.p[4]){//对子
s.rank1 = 2;
if(s.p[0]==s.p[1]) s.rank2 = s.p[0], s.rank3 = s.p[2]+s.p[3]+s.p[4];
if(s.p[1]==s.p[2]) s.rank2 = s.p[1], s.rank3 = s.p[0]+s.p[3]+s.p[4];
if(s.p[2]==s.p[3]) s.rank2 = s.p[2], s.rank3 = s.p[1]+s.p[0]+s.p[4];
if(s.p[3]==s.p[4]) s.rank2 = s.p[3], s.rank3 = s.p[1]+s.p[0]+s.p[2];
s.rank4 = 0;
}
else s.rank1 = 1, s.rank2 = s.p[0]+s.p[1]+s.p[2]+s.p[3]+s.p[4], s.rank3 = s.rank4 = 0;//单牌
return pin;
}
bool operator< (Player& s){
if(rank1!=s.rank1) return rank1>s.rank1;
if(rank2!=s.rank2) return rank2>s.rank2;
if(rank3!=s.rank3) return rank3>s.rank3;
if(rank4!=s.rank4) return rank4>s.rank4;
return name < s.name;
}
}a[N];
int main(){
int m;
cin >> m;
for(int i = 0; i < m; i++) cin >> a[i];
sort(a, a+m);
for(int i = 0; i < m; i++) cout << a[i].name << endl;
return 0;
}
说是大模拟,其实一百行都不到。