����λ�ã���ҳ > �����̳� > �̳� > �㷨�����ݽṹ 1 - ģ��

�㷨�����ݽṹ 1 - ģ��

��Դ������������|��ʱ�䣺2024-11-26 09:46:09 |���Ķ���86��|�� ��ǩ�� �㷨 ģ�� �� |����������

ģ�� ���� ����������˵��ģ������Ϣѧѧ������Ӵ���Ҳ���Ѷȿ������֪ʶ�㡣���硶A+B ���⡷��У������������ż�ɽ��û���κ��̵�����Σ������硶����ɱ�����������ϵĿ�ս��ͬ�����ż�ɽ����˭��˭ͷ�ۡ� ��ˣ�����ѡ����ģ����Ϊ���㷨�����ݽṹ���ĵ�һ�¡� ���� ������������ʾ�ģ�ģ��ĺ���˼��

�

����

����������˵��ģ������Ϣѧѧ������Ӵ���Ҳ���Ѷȿ������֪ʶ�㡣���� ��A+B ���⡷ ��У��������� ���ż�ɽ��û���κ��̵�����Σ������� ������ɱ�� ���������ϵĿ�ս�� ͬ�����ż�ɽ����˭��˭ͷ�ۡ�
��ˣ�����ѡ����ģ����Ϊ���㷨�����ݽṹ���ĵ�һ�¡�

����

������������ʾ�ģ�ģ��ĺ���˼����ǡ�����ճ������������Ŀ�ṩ����Ϣ��������Ŀ�Ľ������ģ��������ܹ��õ����յĽ���������� ��[CSP-S 2023] �������� Ϊ�����н��ܣ�

С Y ��һ�������Ȧ������������ͼ��ʾ��ÿ����Ȧ���Ǵ� \(0\) �� \(9\) �����֡�ÿ����Ȧ���Ǵ� \(0\) �� \(9\) ��ѭ������ \(9\) ����һ��λ�ú���Ա�� \(0\) �� \(8\) ��
Ëã·¨ÓëÊý¾Ý½á¹¹ 1 - Ä£Äâ
��ΪУ԰��Ƚϰ�ȫ��С Y ���õ�������ʽ�ǣ�����ȷ���뿪ʼ�����ת����������һ�Σ�ÿ�ζ�����ij�����Ƚ�ת��һ����Ȧ����ͬʱת���������ڵIJ�Ȧ��
��С Y ѡ��ͬʱת���������ڲ�Ȧʱ��������Ȧת���ķ�����ͬ����С Y ���Խ��������� \(\tt{0\;0\;1\;1\;5}\) ת�� \(\tt{1\;1\;1\;1\;5}\) ��������ת�� \(\tt{1\;2\;1\;1\;5}\) ��
ʱ����ˣ�С Y Ҳ������ô�����İ�ȫ�ԣ�����С Y �������Լ��������������� \(n\) ��״̬��ע���� \(n\) ��״̬��������ȷ���롣
Ϊ�˼�����ô�����İ�ȫ�ԣ�С Y �ж����ֿ��ܵ���ȷ���룬ʹ��ÿ����ȷ���붼�ܹ������������õ�������ʽ������������������ȫ�� \(n\) ��״̬��

���ѷ�����Ŀ�е�������ֻ�� \(5\) λ�������Կ���ֱ�Ӷ�ÿһ�����ܵ����� \(x\) �� \(x \in \mathbb{Z}\) �� \(00000 \le x \le 99999\) �������жϡ��ж�ʱ�ֱ��� \(n\) ��״̬�Ϳ������벻ͬ��λ����ֻ�� \(1\) λ��ͬ����Ȼ���У��������� \(2\) λ��ͬ������λ��״̬�IJ�ֵ�̶�������������ͬ�ķ��ȣ�Ҳ�ǿ��еġ�Ȼ��ֱ��ͳ�Ƽ��ɡ�

#include 
using namespace std;
int n;
int a[10][10];
int ans = 0;
int b[10];
bool cmp(int x) {
	int cnt = 0, pos;
	for (int i = 1; i <= 5; i++) {
		if (b[i] != a[x][i]) {
			cnt++;
			pos = i;
		}
		if (cnt > 2) return true; // ��ͬ��λ̫��
	}
	if (cnt == 0) return true; // û��
	if (cnt == 1) return false; // ֻ������һλ
	if (b[pos - 1] == a[x][pos - 1]) return true; // �������������
	// ������λ�ķ���
	int f = (b[pos] + 10 - a[x][pos]) % 10;
	int g = (b[pos - 1] + 10 - a[x][pos - 1]) % 10;
	return f != g;
}
bool test() {
	for (int i = 1; i <= n; i++) {
		if (cmp(i)) {
			return false;
		}
	}
	return true;
}
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= 5; j++) {
			scanf("%d", &a[i][j]);
		}
	}
	for (int i = 0; i <= 9; i++) {
		b[1] = i;
		for (int j = 0; j <= 9; j++) {
			b[2] = j;
			for (int k = 0; k <= 9; k++) {
				b[3] = k;
				for (int l = 0; l <= 9; l++) {
					b[4] = l;
					for (int m = 0; m <= 9; m++) {
						b[5] = m;
						if (test()) {
							ans++; // ֱ��ͳ��
						}
				    }
				}
			}
		}
	}
	printf("%d\n", ans);
	return 0;
}

���������������ֱ�ף������κ����Ρ�

����

�Ѷ���������Ҳû�����١�ֻҪ�󵨿�д��С�ĵ��ԣ�һ�н��п��ܣ�
�������룺 �������˿��ơ���Texas Hold'em�� ��

һ���˿��Ƴ�ȥ��С������Ͷ��ֱַ��� \(2\) ����֪���ƣ������������� \(3\) ����֪�����ƺ� \(2\) ��δ֪�����ơ�
���� 2 ��δ֪�����ƣ������� \(5\) �Ź����ƣ���Ͷ��ֱַ�ӵ�� \(2\) �����ƣ��� \(9\) ���ơ��㲻����ѡ����ֵ����ƣ�����Ҳ������ѡ��������ơ������Լ������ƺ͹������У�ѡȡ \(5\) ��������͡�����ͬ����˫�����Ϳ������ظ��Ĺ����ơ�
��Ͷ��ֶ�Ҫѡ�������ϣ���������δ֪�Ƶ����п�������У���Ļ�ʤ�����Ƕ��١�ƽ�ֲ����ڻ�ʤ��
���͵ıȽϷ����ο��±�����С�´󣩣�
Ëã·¨ÓëÊý¾Ý½á¹¹ 1 - Ä£Äâ

��Ŀ�ı�����������Ǽ�����ʡ�������֪��ö��ÿ�ֿ��ܵ�������ÿ��з����������ܷ��������Ǹ��ʡ�����ֱ��ö��ʣ�µ� \(2\) �Ź����ƾ����ˡ�ʣ�µ�ʱ�佻��д����͵��ԣ�

// �����е�ע�ͳ��� ��Chinglish�� ��ƴ������Ϊ֮ǰ��̨������֧���������뷨�����ȴպ��ſ��ɡ�
#include 
using namespace std;
struct card {
	int c, n;
	/*
	c:
	0 -> Spades
	1 -> Hearts
	2 -> Diamonds
	3 -> Clubs
	n:
	A -> 14 / 1
	K -> 13
	Q -> 12
	J -> 11
	T -> 10
	9-2
	*/
};
map vis;
bool operator == (card &x, card &y) {
	return x.c == y.c && x.n == y.n;
}
card me[2], en[2], pu[9]; // me, enemy, public(last 2 for users)
card a[5] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, b[5] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, c[5] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // compare a and b. a->me, b->enemy; c for the best choice
int s1, s2, s3; // judge kind of card
/*
9 -> huang jia tong hua shun
8 -> tong hua shun
7 -> si tiao
6 -> mam tang hong
5 -> tong hua
4 -> shun zi
3 -> san tiao
2 -> liang dui
1 -> yi dui
0 -> gao pai
*/
bool ok(int i, int j, int k, int l) {
	return !vis[i*20+ j] && !vis[k*20+l] && i * 20 + j != k * 20 + l;
}
bool cmp(card &x, card &y) {
	return (x.n != y.n) ? (x.n > y.n) : (x.c < y.c);
}
bool cmpa() {
	/*
	return value:
	1 -> win
	0 -> lost / draw
	*/
	// diff kind
	if (s1 != s3) return s1 > s3;
	if (s1 == 9) return 0;
	if (s1 == 8) {
		return a[0].n > c[0].n;
	}
	if (s1 == 7) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		return a[4].n > c[4].n;
	}
	if (s1 == 6) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		return a[4].n > c[4].n;
	}
	if (s1 == 5) {
		for (int i = 0; i < 5; i++) {
			if (a[i].n != c[i].n) return a[i].n > c[i].n;
		}
		return 0;
	}
	if (s1 == 4) {
		return a[0].n > c[0].n;
	}
	if (s1 == 3) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		if (a[3].n != c[3].n) return a[3].n > c[3].n;
		return a[4].n > c[4].n;
	}
	if (s1 == 2) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		if (a[3].n != c[3].n) return a[3].n > c[3].n;
		return a[4].n > c[4].n;
	}
	if (s1 == 1) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		for (int i = 2; i < 5; i++) {
			if (a[i].n != c[i].n) return a[i].n > c[i].n;
		}
		return 0;
	}
	for (int i = 0; i < 5; i++) {
		if (a[i].n != c[i].n) return a[i].n > c[i].n;
	}
	return 0; // default
}
bool cmpb() {
	/*
	return value:
	1 -> win
	0 -> lost / draw
	*/
	// diff kind
	if (s2 != s3) return s2 > s3;
	if (s2 == 9) return 0;
	if (s2 == 8) {
		return b[0].n > c[0].n;
	}
	if (s2 == 7) {
		if (b[0].n != c[0].n) return b[0].n > c[0].n;
		return b[4].n > c[4].n;
	}
	if (s2 == 6) {
		if (b[0].n != c[0].n) return b[0].n > c[0].n;
		return b[4].n > c[4].n;
	}
	if (s2 == 5) {
		for (int i = 0; i < 5; i++) {
			if (b[i].n != c[i].n) return b[i].n > c[i].n;
		}
		return 0;
	}
	if (s2 == 4) {
		return b[0].n > c[0].n;
	}
	if (s2 == 3) {
		if (b[0].n != c[0].n) return b[0].n > c[0].n;
		if (b[3].n != c[3].n) return b[3].n > c[3].n;
		return b[4].n > c[4].n;
	}
	if (s2 == 2) {
		if (b[0].n != c[0].n) return b[0].n > c[0].n;
		if (b[3].n != c[3].n) return b[3].n > c[3].n;
		return b[4].n > c[4].n;
	}
	if (s2 == 1) {
		if (b[0].n != c[0].n) return b[0].n > c[0].n;
		for (int i = 2; i < 5; i++) {
			if (b[i].n != c[i].n) return b[i].n > c[i].n;
		}
		return 0;
	}
	for (int i = 0; i < 5; i++) {
		if (b[i].n != c[i].n) return b[i].n > c[i].n;
	}
	return 0; // default
}
bool check() {
	/*
	return value:
	1 -> win
	0 -> lost / draw
	*/
	// diff kind
	if (s1 != s2) return s1 > s2;
	if (s1 == 9) return 0;
	if (s1 == 8) {
		return a[0].n > b[0].n;
	}
	if (s1 == 7) {
		if (a[0].n != b[0].n) return a[0].n > b[0].n;
		return a[4].n > b[4].n;
	}
	if (s1 == 6) {
		if (a[0].n != b[0].n) return a[0].n > b[0].n;
		return a[4].n > b[4].n;
	}
	if (s1 == 5) {
		for (int i = 0; i < 5; i++) {
			if (a[i].n != b[i].n) return a[i].n > b[i].n;
		}
		return 0;
	}
	if (s1 == 4) {
		return a[0].n > b[0].n;
	}
	if (s1 == 3) {
		if (a[0].n != b[0].n) return a[0].n > b[0].n;
		if (a[3].n != b[3].n) return a[3].n > b[3].n;
		return a[4].n > b[4].n;
	}
	if (s1 == 2) {
		if (a[0].n != b[0].n) return a[0].n > b[0].n;
		if (a[3].n != b[3].n) return a[3].n > b[3].n;
		return a[4].n > b[4].n;
	}
	if (s1 == 1) {
		if (a[0].n != b[0].n) return a[0].n > b[0].n;
		for (int i = 2; i < 5; i++) {
			if (a[i].n != b[i].n) return a[i].n > b[i].n;
		}
		return 0;
	}
	for (int i = 0; i < 5; i++) {
		if (a[i].n != b[i].n) return a[i].n > b[i].n;
	}
	return 0; // default
}
void judgec() {
	// (huang jia) tong hua shun
	if (c[0].c == c[1].c && c[1].c == c[2].c && c[2].c == c[3].c && c[3].c == c[4].c) {
		if (c[0].n == 14 && c[1].n == 13 && c[2].n == 12 && c[3].n == 11 && c[4].n == 10) { // AKQJT
			s3 = 9;
			return;
		}
		if (c[0].n == c[1].n + 1 && c[1].n == c[2].n + 1 && c[2].n == c[3].n + 1 && c[3].n == c[4].n + 1) { // shun zi
			s3 = 8;
			return;
		}
		if (c[0].n == 14 && c[1].n == 5 && c[2].n == 4 && c[3].n == 3 && c[4].n == 2) { // A2345
			swap(c[0], c[1]);
			swap(c[1], c[2]);
			swap(c[2], c[3]);
			swap(c[3], c[4]);
			c[4].n = 1;
			s3 = 8;
			return;
		}
	}
	// 4 tiao
	if (c[0].n == c[1].n && c[1].n == c[2].n && c[2].n == c[3].n) {
		s3 = 7;
		return;
	}
	if (c[1].n == c[2].n && c[2].n == c[3].n && c[3].n == c[4].n) {
		swap(c[0], c[4]);
		s3 = 7;
		return;
	}
	// 3 dai 2
	if (c[0].n == c[1].n && c[1].n == c[2].n && c[3].n == c[4].n) {
		s3 = 6;
		return;
	}
	if (c[0].n == c[1].n && c[2].n == c[3].n && c[3].n == c[4].n) {
		s3 = 6;
		// tiao zheng pai de shun xu
		swap(c[0], c[4]);
		swap(c[1], c[3]);
		return;
	}
	// tong hua
	if (c[0].c == c[1].c && c[1].c == c[2].c && c[2].c == c[3].c && c[3].c == c[4].c) {
		s3 = 5;
		return;
	}
	// shun zi
	if (c[0].n == c[1].n + 1 && c[1].n == c[2].n + 1 && c[2].n == c[3].n + 1 && c[3].n == c[4].n + 1) { // shun zi
		s3 = 4;
		return;
	}
	if (c[0].n == 14 && c[1].n == 5 && c[2].n == 4 && c[3].n == 3 && c[4].n == 2) { // A2345
		s3 = 4;
		c[0].n = 1;
		swap(c[0], c[1]);
		swap(c[1], c[2]);
		swap(c[2], c[3]);
		swap(c[3], c[4]);
		return;
	}
	// 3 tiao
	if (c[0].n == c[1].n && c[1].n == c[2].n) {
		s3 = 3;
		return;
	}
	if (c[1].n == c[2].n && c[2].n == c[3].n) {
		s3 = 3;
		c[3] = c[0];
		c[0] = c[1];
		if (c[3].n < c[4].n) swap(c[3], c[4]);
		return;
	}
	if (c[2].n == c[3].n && c[3].n == c[4].n) {
		s3 = 3;
		swap(c[1], c[2]);
		swap(c[2], c[3]);
		swap(c[3], c[4]);
		swap(c[0], c[1]);
		swap(c[1], c[2]);
		swap(c[2], c[3]);
		return;
	}
	// 2 dui
	if (c[0].n == c[1].n) {
		if (c[2].n == c[3].n) {
			s3 = 2;
			return;
		}
		if (c[3].n == c[4].n) {
			s3 = 2;
			swap(c[2], c[3]);
			swap(c[3], c[4]);
			return;
		}
	}
	if (c[1].n == c[2].n) {
		if (c[3].n == c[4].n) {
			s3 = 2;
			swap(c[0], c[1]);
			swap(c[1], c[2]);
			swap(c[2], c[3]);
			swap(c[3], c[4]);
			return;
		}
	}
	// 1 dui
	if (c[0].n == c[1].n) {
		s3 = 1;
		return;
	}
	if (c[1].n == c[2].n) {
		s3 = 1;
		swap(c[2], c[0]);
		return;
	}
	if (c[2].n == c[3].n) {
		s3 = 1;
		swap(c[0], c[2]);
		swap(c[1], c[3]);
		return;
	}
	if (c[3].n == c[4].n) {
		s3 = 1;
		swap(c[0], c[3]);
		swap(c[1], c[4]);
		swap(c[2], c[3]);
		swap(c[3], c[4]);
		return;
	}
	// san pai
	s3 = 0;
	return;
}
int main() {
	string s;
	while (cin >> s) {
		if (s == "#") break;
		{
			int num, cd;
			if (s[0] == 'S') cd = 0;
			if (s[0] == 'H') cd = 1;
			if (s[0] == 'D') cd = 2;
			if (s[0] == 'C') cd = 3;
			if (s[1] == 'A') num = 14;
			else if (s[1] == 'T') num = 10;
			else if (s[1] == 'J') num = 11;
			else if (s[1] == 'Q') num = 12;
			else if (s[1] == 'K') num = 13;
			else num = s[1] - '0';
			me[0] = {cd, num};
			cin >> s;
			if (s[0] == 'S') cd = 0;
			if (s[0] == 'H') cd = 1;
			if (s[0] == 'D') cd = 2;
			if (s[0] == 'C') cd = 3;
			if (s[1] == 'A') num = 14;
			else if (s[1] == 'T') num = 10;
			else if (s[1] == 'J') num = 11;
			else if (s[1] == 'Q') num = 12;
			else if (s[1] == 'K') num = 13;
			else num = s[1] - '0';
			me[1] = {cd, num};
			cin >> s;
			if (s[0] == 'S') cd = 0;
			if (s[0] == 'H') cd = 1;
			if (s[0] == 'D') cd = 2;
			if (s[0] == 'C') cd = 3;
			if (s[1] == 'A') num = 14;
			else if (s[1] == 'T') num = 10;
			else if (s[1] == 'J') num = 11;
			else if (s[1] == 'Q') num = 12;
			else if (s[1] == 'K') num = 13;
			else num = s[1] - '0';
			en[0] = {cd, num};
			cin >> s;
			if (s[0] == 'S') cd = 0;
			if (s[0] == 'H') cd = 1;
			if (s[0] == 'D') cd = 2;
			if (s[0] == 'C') cd = 3;
			if (s[1] == 'A') num = 14;
			else if (s[1] == 'T') num = 10;
			else if (s[1] == 'J') num = 11;
			else if (s[1] == 'Q') num = 12;
			else if (s[1] == 'K') num = 13;
			else num = s[1] - '0';
			en[1] = {cd, num};
			cin >> s;
			if (s[0] == 'S') cd = 0;
			if (s[0] == 'H') cd = 1;
			if (s[0] == 'D') cd = 2;
			if (s[0] == 'C') cd = 3;
			if (s[1] == 'A') num = 14;
			else if (s[1] == 'T') num = 10;
			else if (s[1] == 'J') num = 11;
			else if (s[1] == 'Q') num = 12;
			else if (s[1] == 'K') num = 13;
			else num = s[1] - '0';
			pu[0] = {cd, num};
			cin >> s;
			if (s[0] == 'S') cd = 0;
			if (s[0] == 'H') cd = 1;
			if (s[0] == 'D') cd = 2;
			if (s[0] == 'C') cd = 3;
			if (s[1] == 'A') num = 14;
			else if (s[1] == 'T') num = 10;
			else if (s[1] == 'J') num = 11;
			else if (s[1] == 'Q') num = 12;
			else if (s[1] == 'K') num = 13;
			else num = s[1] - '0';
			pu[1] = {cd, num};
			cin >> s;
			if (s[0] == 'S') cd = 0;
			if (s[0] == 'H') cd = 1;
			if (s[0] == 'D') cd = 2;
			if (s[0] == 'C') cd = 3;
			if (s[1] == 'A') num = 14;
			else if (s[1] == 'T') num = 10;
			else if (s[1] == 'J') num = 11;
			else if (s[1] == 'Q') num = 12;
			else if (s[1] == 'K') num = 13;
			else num = s[1] - '0';
			pu[2] = {cd, num};
		} // input
		vis[me[0].c * 20 + me[0].n] = vis[me[1].c * 20 + me[1].n] = vis[en[0].c * 20 + en[0].n] = vis[en[1].c * 20 + en[1].n] = vis[pu[0].c * 20 + pu[0].n] = vis[pu[1].c * 20 + pu[1].n] = vis[pu[2].c * 20 + pu[2].n] = 1;
		int ans = 0, cnt = 0;
		for (int i = 0; i < 4; i++) {
			for (int j = 2; j <= 14; j++) {
				for (int k = 0; k < 4; k++) {
					for (int l = 2; l <= 14; l++) {
						pu[3] = {i, j};
						pu[4] = {k, l};
						if (!ok(i, j, k, l)) continue;
						memset(a, 0, sizeof(a));
						memset(b, 0, sizeof(b));
						memset(c, 0, sizeof(c));
						s3 = s1 = s2 = 0;
						card t = {0, 0};
						for (int i = 5; i < 9; i++) pu[i] = t;
						// select card
						for (int m = 0; m < 7; m++) {
							for (int n = m + 1; n < 7; n++) {
								for (int o = n + 1; o < 7; o++) {
									for (int p = o + 1; p < 7; p++) {
										for (int q = p + 1; q < 7; q++) {
											pu[5] = me[0];
											pu[6] = me[1];
											c[0] = pu[m];
											c[1] = pu[n];
											c[2] = pu[o];
											c[3] = pu[p];
											c[4] = pu[q];
											sort(c, c + 5, cmp);
											judgec();
											if (!cmpa()) {
												for (int i = 0; i < 5; i++) a[i] = c[i];
												s1 = s3;
											}
											pu[5] = en[0];
											pu[6] = en[1];
											c[0] = pu[m];
											c[1] = pu[n];
											c[2] = pu[o];
											c[3] = pu[p];
											c[4] = pu[q];
											sort(c, c + 5, cmp);
											judgec();
											if (!cmpb()) {
												for (int i = 0; i < 5; i++) b[i] = c[i];
												s2 = s3;
											}
										}
									}
								}
							}
						}
						// cnt win
						ans += check();
						cnt++;
					}
				}
			}
		}
		double pwin = (double)ans / cnt;
		cout << fixed << setprecision(20) << pwin << endl;
		vis[me[0].c * 20 + me[0].n] = vis[me[1].c * 20 + me[1].n] = vis[en[0].c * 20 + en[0].n] = vis[en[1].c * 20 + en[1].n] = vis[pu[0].c * 20 + pu[0].n] = vis[pu[1].c * 20 + pu[1].n] = vis[pu[2].c * 20 + pu[2].n] = 0;
	}
	return 0;
}

���Կ�����ģ������������Ⲣ���ѣ���Ҫ�������ǵ������Խ�˼��ת��Ϊ���롣
ֻҪ�����ϰ�����ѵ�ģ���ⶼ����������

��ҵ

  1. [CSP-S 2023] �ṹ��
  2. [THUPC 2023 ����] �������ϵĿ�ս
С���Ƽ��Ķ�

�������������Ľ�Ϊ������Ϣ����������������ͬ���޹۵��֤ʵ��������

�����Ƶ����

����

ͬ������

����

ɨ��ά�����������ֻ��汾��

ɨ��ά����������΢�Ź��ںţ�

��վ�������������������ϴ��������ַ���İ�Ȩ���뷢�ʼ�[email protected]

��ICP��2022002427��-10 �湫��������43070202000427��© 2013~2025 haote.com ������