95分 WA on #3
查看原帖
95分 WA on #3
499627
arc_suvr楼主2022/8/11 14:04
#include <bits/stdc++.h>
using namespace std;

int T, n, sum[20], tmp, st;

// 2 3 4 5 6 7 8 9 10 J Q K A ZF

int ans = 1e9 + 5;

// 顺 -> 双顺 -> 三顺 -> 炸弹 

void dfs(int x) {
	if (x >= ans) return ;
	int cnt = 0;
	for (int i = 3; i <= 14; i++) {
		if (sum[i] == 0) cnt = 0;
		else cnt++;
		if (cnt >= 5) {
			for (int j = i; j >= i - cnt + 1; j--) {
				sum[j]--;
			}
			dfs(x + 1);
			for (int j = i; j >= i - cnt + 1; j--) {
				sum[j]++;
			}
		}
	}
	cnt = 0;
	for (int i = 3; i <= 14; i++) {
		if (sum[i] <= 1) cnt = 0;
		else cnt++;
		if (cnt >= 3) {
			for (int j = i; j >= i - cnt + 1; j--) {
				sum[j] -= 2;
			}
			dfs(x + 1);
			for (int j = i; j >= i - cnt + 1; j--) {
				sum[j] += 2;
			}
		}
	}
	cnt = 0;
	for (int i = 3; i <= 14; i++) {
		if (sum[i] <= 2) cnt = 0;
		else cnt++;
		if (cnt >= 2) {
			for (int j = i; j >= i - cnt + 1; j--) {
				sum[j] -= 3;
			}
			dfs(x + 1);
			for (int j = i; j >= i - cnt + 1; j--) {
				sum[j] += 3;
			}
		}
	}
	for (int i = 2; i <= 14; i++) {
		if (sum[i] == 3) {
			sum[i] -= 3;
			for (int j = 2; j <= 14; j++) {
				if (j == i) continue;
				if (sum[j] >= 1) {
					sum[j] -= 1;
					dfs(x + 1);
					sum[j] += 1;
				}
			}
			for (int j = 2; j <= 14; j++) {
				if (j == i) continue;
				if (sum[j] >= 2) {
					sum[j] -= 2;
					dfs(x + 1);
					sum[j] += 2;
				}
			}
			sum[i] += 3;
		}
		if (sum[i] == 4) {
			sum[i] -= 3;
			for (int j = 2; j <= 15; j++) {
				if (j == i) continue;
				if (sum[j] >= 1) {
					sum[j] -= 1;
					dfs(x + 1);
					sum[j] += 1;
				}
			}
			for (int j = 2; j <= 14; j++) {
				if (j == i) continue;
				if (sum[j] >= 2) {
					sum[j] -= 2;
					dfs(x + 1);
					sum[j] += 2;
				}
			}
			sum[i] += 3;
			
			sum[i] -= 4;
			for (int j = 2; j <= 15; j++) {
				if (j == i || sum[j] < 1) continue;
				sum[j] -= 1;
				for (int k = 2; k <= 15; k++) {
					if (k == i || k == j || sum[k] < 1) continue;
					sum[k] -= 1;
					dfs(x + 1);
					sum[k] += 1;
				}
				sum[j] += 1;
			}
			for (int j = 2; j <= 14; j++) {
				if (j == i || sum[j] <= 1) continue;
				sum[j] -= 2;
				for (int k = 2; k <= 14; k++) {
					if (k == i || k == j || sum[k] <= 1) continue;
					sum[k] -= 2;
					dfs(x + 1);
					sum[k] += 2;
				}
				sum[j] += 2;
			}
			sum[i] += 4;			
		}
	}
	int ans1 = x;
	for (int i = 2; i <= 15; i++) {
		if (sum[i]) ans1++;
	}
	ans = min(ans, ans1);
}

/*
int anss[1005], cnt;
*/ 

int main() {
	cin >> T >> st;
	// for (int i = 1; i <= T; i++) cin >> anss[i];
	cin >> T >> st;
	while (T--) {
		for (int i = 1; i <= st; i++) {
			cin >> n >> tmp;
			if (n == 0) sum[15]++;
			else if (n == 1) sum[14]++;
			else sum[n]++;
		}	
		dfs(0);
		printf("%d\n", ans);
		/*
			cnt++;
			if (ans != anss[cnt]) {
				printf("\n");
				printf("%d %d\n", ans, anss[cnt]);
				for (int i = 2; i <= 15; i++) {
					printf("%d %d\n", i, sum[i]);
				}
				return 0;
			}
		*/
		memset(sum, 0, sizeof sum);
		ans = 1e9 + 5;
	}	
	return 0;
} 
2022/8/11 14:04
加载中...