rt,本人交了 20 多次了,已崩溃,如有大佬指出代码问题或者提供 hack 数据,不胜感激。
(代码有注释)
#include <bits/stdc++.h>
#define endl '\n'
#define chkp1 (p[p1].cowScore>=7 && p[p1].cowScore<=9?20:10)*(iB1+1)*(nn1==10?3:1)
#define chkp2 (p[p2].cowScore>=7 && p[p2].cowScore<=9?20:10)*(iB2+1)*(nn2==10?3:1)
#define turn(p) (num[now][p]=='X'?10:num[now][p]-'0')
using namespace std;
const int N=1e6+5;
int id,T,n;
long long score[N];
string s[N];
string cards[5][10],cur[5];
char col[5][10],num[5][10];
unordered_map<string,int> name;
struct cardCheck{
int bomb;//炸弹(如没有为0)
int cowScore;//牛数(牛一至牛九:1-9,牛牛 0,无为-1)
int ironBoard;//铁板 (如没有为0)
int maxNum;//当前手牌最大点数
char maxCol;//最大花色
}p[5];
class Buffalo{
public:
void separateCards(int now){//分离手牌
for(int i=1;i<=5;i++){
col[now][i]=cards[now][i][0];
int left=cards[now][i].size()-1;
string s=cards[now][i].substr(1,left);
if(s=="A") num[now][i]='1';
else if(s=="10") num[now][i]='X';
else num[now][i]=s[0];
}
}
void initCard(int now){//判断牌型
unordered_map<char,int> mp; mp.clear();
// just find maxCard :)
for(int i=1;i<=5;i++){
int curNum=turn(i);
if(curNum>p[now].maxNum){
p[now].maxNum=curNum;
p[now].maxCol=col[now][i];
}
else if(curNum==p[now].maxNum){
p[now].maxCol=min(p[now].maxCol,col[now][i]);
}
}
if(!p[now].bomb && p[now].cowScore==-1 && !p[now].ironBoard){
int Total=turn(1)+turn(2)+turn(3)+turn(4)+turn(5);
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
for(int k=1;k<=5;k++){
if(i!=j && j!=k && i!=k){
int tot=turn(i)+turn(j)+turn(k);
if(tot%10==0){
if(p[now].cowScore==0) continue;
p[now].cowScore=max(p[now].cowScore,(Total-tot)%10);
}
}
}
}
for(int i=1;i<=5;i++){
char c=num[now][i];
mp[c]++;
if(mp[c]==4){ // four cards are same | bomb
p[now].bomb=(c=='X'?10:c-'0');
p[now].cowScore=-1; p[now].ironBoard=0;
}
if(mp[c]==3){ // three cards are same | ironBoard
if(p[now].cowScore==0) continue;
int tot=0;
for(int i=1;i<=5;i++) tot+=(num[now][i]==c?0:turn(i));
if(tot%10>=p[now].cowScore)
p[now].ironBoard=c-'0',p[now].cowScore=tot%10;
}
}
}
void add(int now,int sc){
score[now]+=sc;
}
void fight(int p1,int p2){//pk
int iB1=(p[p1].ironBoard>0?1:0);
int iB2=(p[p2].ironBoard>0?1:0);
int nn1=(p[p1].cowScore==0?10:p[p1].cowScore);
int nn2=(p[p2].cowScore==0?10:p[p2].cowScore);
if(p[p1].bomb || p[p2].bomb){
if(p[p1].bomb && p[p2].bomb){
if(p[p1].bomb>p[p2].bomb) return add(name[cur[p1]],100),add(name[cur[p2]],-100),void();
if(p[p1].bomb<p[p2].bomb) return add(name[cur[p2]],100),add(name[cur[p1]],-100),void();
if(p[p1].bomb==p[p2].bomb) goto next;
}
if(p[p1].bomb) return add(name[cur[p1]],100),add(name[cur[p2]],-100),void();
if(p[p2].bomb) return add(name[cur[p2]],100),add(name[cur[p1]],-100),void();
}
next:;
if(p[p1].cowScore!=p[p2].cowScore){
if(nn1>nn2) return add(name[cur[p1]],chkp1),add(name[cur[p2]],-chkp1),void();
if(nn1<nn2) return add(name[cur[p2]],chkp2),add(name[cur[p1]],-chkp2),void();
}
if(p[p1].cowScore==p[p2].cowScore){
if(iB1^iB2==1){
if(iB1) return add(name[cur[p1]],chkp1),add(name[cur[p2]],-chkp1),void();
if(iB2) return add(name[cur[p2]],chkp2),add(name[cur[p1]],-chkp2),void();;
}
else
{
if(iB1){
if(p[p1].ironBoard>p[p2].ironBoard) return add(name[cur[p1]],chkp1),add(name[cur[p2]],-chkp1),void();;
if(p[p1].ironBoard<p[p2].ironBoard) return add(name[cur[p2]],chkp2),add(name[cur[p1]],-chkp2),void();;
}
else
{
if(p[p1].maxNum>p[p2].maxNum) return add(name[cur[p1]],chkp1),add(name[cur[p2]],-chkp1),void();;
if(p[p1].maxNum<p[p2].maxNum) return add(name[cur[p2]],chkp2),add(name[cur[p1]],-chkp2),void();;
if(p[p1].maxCol<p[p2].maxCol) return add(name[cur[p1]],chkp1),add(name[cur[p2]],-chkp1),void();;
if(p[p1].maxCol>p[p2].maxCol) return add(name[cur[p2]],chkp2),add(name[cur[p1]],-chkp2),void();;
}
}
}
}
void playGame(int A,int B,int C){
fight(A,B);
fight(B,C);
fight(A,C);
}
void initPlayer(int A,int B,int C){//初始化
p[A].bomb=p[A].ironBoard=p[A].maxNum=0; p[A].maxCol='d';p[A].cowScore=-1;
p[B].bomb=p[B].ironBoard=p[B].maxNum=0; p[B].maxCol='d';p[B].cowScore=-1;
p[C].bomb=p[C].ironBoard=p[C].maxNum=0; p[C].maxCol='d';p[C].cowScore=-1;
}
}Game;
int main(){
cin>>id>>T>>n;
for(int i=1;i<=n;i++) cin>>s[i],name[s[i]]=i;
while(T--){
for(int i=1;i<=3;i++){
cin>>cur[i];
for(int j=1;j<=5;j++) cin>>cards[i][j];
Game.separateCards(i);
}
Game.initPlayer(1,2,3);
for(int i=1;i<=3;i++) Game.initCard(i);
Game.playGame(1,2,3);
}
for(int i=1;i<=n;i++){
cout<<s[i]<<' '<<score[i]<<endl;
}
return 0;
}