求助50分
查看原帖
求助50分
112917
Eason_AC楼主2020/8/15 10:32

没有数据点所以只能求大佬帮忙查错了qwq

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <map>
#define F(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
using namespace std;

int useless, t, n;
struct player {
	string name;
	int card[7], num[17], col[7], sum, niu, tieban, maxx, bomb, score, idd;
	/*
		card:记每个牌的点数
		num:记每种点数出现在的牌的数量
		col:记每张牌的花色 
		sum:记所有牌点数的和 
		niu:记牌的类型
			niu=0-10 无牛、牛一至九、牛牛 
		tieban:记录铁板的点数,如果没有铁板则记为0。 
		maxx:记录所有牌中最大的点数
		bomb:记录炸弹的点数,如果没有炸弹则记为0. 
	*/
}a[500007];
map<string, int> hashmap;

inline void cle(int id) {
	memset(a[id].card, 0, sizeof(a[id].card));
	memset(a[id].num, 0, sizeof(a[id].num));
	memset(a[id].col, 0, sizeof(a[id].col));
	a[id].sum = a[id].niu = a[id].tieban = a[id].maxx = a[id].bomb = a[id].idd = 0;
}
inline void pk(int id1, int id2) {
	int difen = 10, sf = 0;
	if(a[id1].bomb > a[id2].bomb) {
//		puts("Go there -> *o* NO!!!!!BOMB!!!!!");
		sf = 1;
//		printf("Winner is %d\n", sf);
		difen *= 10;
		a[id1].score += difen;
		a[id2].score -= difen;
		return;
	} else if(a[id1].bomb < a[id2].bomb) {
//		puts("Go there -> *o* NO!!!!!BOMB!!!!!");
		sf = 2;
//		printf("Winner is %d\n", sf);
		difen *= 10;
		a[id1].score -= difen;
		a[id2].score += difen;
		return;
	} else if(a[id1].niu > a[id2].niu) {
		if(a[id1].niu == 10)
			difen *= 3;
		else if(a[id1].niu >= 7 && a[id1].niu <= 9)
			difen *= 2;
		else
			difen *= 1;
		if(a[id1].tieban)	difen *= 2;
		sf = 1;
	} else if(a[id1].niu < a[id2].niu) {
		if(a[id2].niu == 10)
			difen *= 3;
		else if(a[id2].niu >= 7 && a[id2].niu <= 9)
			difen *= 2;
		else
			difen *= 1;
		if(a[id2].tieban)	difen *= 2;
		sf = 2;
	} else if(a[id1].niu == a[id2].niu && a[id1].niu) {
//		puts("Go there -> -_-");
		if(!a[id1].tieban && !a[id2].tieban) {
			if(a[id1].maxx != a[id2].maxx) {
				if(a[id1].maxx > a[id2].maxx)
					sf = 1;
				else if(a[id1].maxx < a[id2].maxx)
					sf = 2;
				if(sf == 1) {
					if(a[id1].niu == 10)	difen *= 3;
					else if(a[id1].niu >= 7 && a[id1].niu <= 9)	difen *= 2;
					else 	difen *= 1;
				} else if(sf == 2) {
					if(a[id2].niu == 10)	difen *= 3;
					else if(a[id2].niu >= 7 && a[id2].niu <= 9)	difen *= 2;
					else	difen *= 1;
				}
			} else {
//				puts("You are reaching the light! -> ^o^");
				if(a[id1].idd > a[id2].idd)
					sf = 1;
				else if(a[id1].idd < a[id2].idd)
					sf = 2;
			}
			if(a[id1].tieban > a[id2].tieban) {
				difen *= 2;
				sf = 1;
			} else if(a[id1].tieban < a[id2].tieban) {
				difen *= 2;
				sf = 2; 
			}
		} else if(a[id1].tieban > a[id2].tieban) {
			difen *= 2;
			sf = 1;
		} else if(a[id1].tieban < a[id2].tieban){
			difen *= 2;
			sf = 2;
		}
	} else if(!a[id1].niu && !a[id2].niu) {
		if(a[id1].maxx != a[id2].maxx) {
			if(a[id1].maxx > a[id2].maxx)
				sf = 1;
			else if(a[id1].maxx < a[id2].maxx)
				sf = 2;
		} else {
			if(a[id1].col[a[id1].idd] > a[id2].col[a[id2].idd])
				sf = 1;
			else if(a[id1].col[a[id1].idd] < a[id2].col[a[id2].idd])
				sf = 2;
		}
		if(sf == 1 && a[id1].tieban)	difen *= 2;
		else if(sf == 2 && a[id2].tieban)	difen *= 2;
	}
//	printf("Winner is %d\n", sf);
	if(sf == 1)	a[id1].score += difen, a[id2].score -= difen;
	else	a[id1].score -= difen, a[id2].score += difen; 
}

int main() {
	scanf("%d%d%d", &useless, &t, &n);
	F(i, 1, n) {
		cin >> a[i].name;
		hashmap[a[i].name] = i;
	}
	while(t--) {
		string s1, s2, s3;
		int t1, t2, t3;
		cin >> s1; t1 = hashmap[s1];
		F(i, 1, 5) {
			string cards;
			cin >> cards;
			if(cards[1] == '1' && cards[2] == '0')	a[t1].card[i] = 10;
			else if(cards[1] == 'A')	a[t1].card[i] = 1;
			else	a[t1].card[i] = cards[1] - '0';	
			a[t1].sum += a[t1].card[i];
			a[t1].num[a[t1].card[i]]++;
			if(cards[0] == 'a')	a[t1].col[i] = 4;
			if(cards[0] == 'b')	a[t1].col[i] = 3;
			if(cards[0] == 'c')	a[t1].col[i] = 2;
			if(cards[0] == 'd')	a[t1].col[i] = 1;
			if(a[t1].card[i] > a[t1].maxx) {
				a[t1].maxx = a[t1].card[i];
				a[t1].idd = a[t1].col[i];
			}
		}
		F(i, 1, 5) {
//			printf("%d %d\n", a[t1].card[i], a[t1].col[i]);
			if(a[t1].num[a[t1].card[i]] == 4) {
				a[t1].bomb = a[t1].card[i];
				break;
			}
			if(a[t1].num[a[t1].card[i]] == 3) {
				a[t1].tieban = a[t1].card[i];
				if(!((a[t1].sum - a[t1].card[i] * 3) % 10))	a[t1].niu = 10;
				else	a[t1].niu = (a[t1].sum - a[t1].card[i] * 3) % 10;
			}
			F(j, 1, 5) {
				if(i == j)	continue;
				if((a[t1].card[i] + a[t1].card[j]) % 10 == a[t1].sum % 10) {
					int p = a[t1].niu;
					if(!((a[t1].card[i] + a[t1].card[j]) % 10))	a[t1].niu = 10;
					else	a[t1].niu = max(a[t1].niu, (a[t1].card[i] + a[t1].card[j]) % 10);
					if(a[t1].niu > p) a[t1].tieban = 0;
				}
			}
		}
		cin >> s2; t2 = hashmap[s2];
		F(i, 1, 5) {
			string cards;
			cin >> cards;
			if(cards[1] == '1' && cards[2] == '0')	a[t2].card[i] = 10;
			else if(cards[1] == 'A')	a[t2].card[i] = 1;
			else	a[t2].card[i] = cards[1] - '0';
			a[t2].sum += a[t2].card[i];
			a[t2].num[a[t2].card[i]]++;
			if(cards[0] == 'a')	a[t2].col[i] = 4;
			if(cards[0] == 'b')	a[t2].col[i] = 3;
			if(cards[0] == 'c')	a[t2].col[i] = 2;
			if(cards[0] == 'd')	a[t2].col[i] = 1;
			if(a[t2].card[i] > a[t2].maxx) {
				a[t2].maxx = a[t2].card[i];
				a[t2].idd = a[t2].col[i];
			}
		}
		F(i, 1, 5) {
//			printf("%d %d\n", a[t2].card[i], a[t2].col[i]);
			if(a[t2].num[a[t2].card[i]] == 4) {
				a[t2].bomb = a[t2].card[i];
				break;
			}
			if(a[t2].num[a[t2].card[i]] == 3) {
				a[t2].tieban = a[t2].card[i];
				if(!((a[t2].sum - a[t2].card[i] * 3) % 10))	a[t2].niu = 10;
				else	a[t2].niu = (a[t2].sum - a[t2].card[i] * 3) % 10;
			}
			F(j, 1, 5) {
				if(i == j)	continue;
				if((a[t2].card[i] + a[t2].card[j]) % 10 == a[t2].sum % 10) {
					int p = a[t2].niu;
					if(!((a[t2].card[i] + a[t2].card[j]) % 10))	a[t2].niu = 10;
					else	a[t2].niu = max(a[t2].niu, (a[t2].card[i] + a[t2].card[j]) % 10);
					if(a[t2].niu > p)	a[t2].tieban = 0;
				}
			}
		}
		cin >> s3; t3 = hashmap[s3];
		F(i, 1, 5) {
			string cards;
			cin >> cards;
			if(cards[1] == '1' && cards[2] == '0')	a[t3].card[i] = 10;
			else if(cards[1] == 'A')	a[t3].card[i] = 1;
			else	a[t3].card[i] = cards[1] - '0';
			a[t3].sum += a[t3].card[i];
			a[t3].num[a[t3].card[i]]++;
			if(cards[0] == 'a')	a[t3].col[i] = 4;
			if(cards[0] == 'b')	a[t3].col[i] = 3;
			if(cards[0] == 'c')	a[t3].col[i] = 2;
			if(cards[0] == 'd')	a[t3].col[i] = 1;
			if(a[t3].card[i] > a[t3].maxx) {
				a[t3].maxx = a[t3].card[i];
				a[t3].idd = a[t3].col[i]; 
			}
		}
		F(i, 1, 5) {
//			printf("%d %d\n", a[t3].card[i], a[t3].col[i]);
			if(a[t3].num[a[t3].card[i]] == 4) {
				a[t3].bomb = a[t3].card[i];
				break;
			}
			if(a[t3].num[a[t3].card[i]] == 3) {
				a[t3].tieban = a[t3].card[i];
				if(!((a[t3].sum - a[t3].card[i] * 3) % 10))	a[t3].niu = 10;
				else	a[t3].niu = (a[t3].sum - a[t3].card[i] * 3) % 10;
			}
			F(j, 1, 5) {
				if(i == j)	continue;
				if((a[t3].card[i] + a[t3].card[j]) % 10 == a[t3].sum % 10) {
					int p = a[t3].niu;
					if(!((a[t3].card[i] + a[t3].card[j]) % 10))	a[t3].niu = 10;
					else	a[t3].niu = max(a[t3].niu, (a[t3].card[i] + a[t3].card[j]) % 10);
					if(a[t3].niu > p)	a[t3].tieban = 0;
				}
			}
		}
//		cout << a[t1].name << '\n';
//		printf("niu=%d bomb=%d tieban=%d sum=%d max=%d idd=%d\n", a[t1].niu, a[t1].bomb, a[t1].tieban, a[t1].sum, a[t1].maxx, a[t1].idd);
//		cout << a[t2].name << '\n';
//		printf("niu=%d bomb=%d tieban=%d sum=%d max=%d idd=%d\n", a[t2].niu, a[t2].bomb, a[t2].tieban, a[t2].sum, a[t2].maxx, a[t2].idd);
//		cout << a[t3].name << '\n';
//		printf("niu=%d bomb=%d tieban=%d sum=%d max=%d idd=%d\n\n", a[t3].niu, a[t3].bomb, a[t3].tieban, a[t3].sum, a[t3].maxx, a[t3].idd);
//		printf("Battle! %d V.S. %d\n\n", t1, t2);
		pk(t1, t2);
//		printf("After turn #1:\n\n");
//		F(i, 1, n)
//			cout << "Player " << a[i].name << " has " << a[i].score << "pts.\n";
//		puts("");
//		printf("Battle! %d V.S. %d\n\n", t1, t3);
		pk(t1, t3);
//		printf("After turn #2:\n\n");
//		F(i, 1, n)
//			cout << "Player " << a[i].name << " has " << a[i].score << "pts.\n";
//		puts("");
//		printf("Battle! %d V.S. %d\n\n", t2, t3);
		pk(t2, t3);
//		printf("After turn #3:\n\n");
//		F(i, 1, n)
//			cout << "Player " << a[i].name << " has " << a[i].score << "pts.\n";
//		puts("");
		cle(t1), cle(t2), cle(t3);
	}
	F(i, 1, n) {
		cout << a[i].name;
		printf(" %d\n", a[i].score);
	}
	return 0;
}
2020/8/15 10:32
加载中...