求助 70pts
查看原帖
求助 70pts
501865
TheSky233楼主2022/7/4 11:25

rt\tt 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;
}

Record\tt Record

2022/7/4 11:25
加载中...