0WA&TLE,求调
查看原帖
0WA&TLE,求调
1354718
Carl_wenzicong楼主2025/8/30 20:38
#include<bits/stdc++.h>
using namespace std;
const int N = 15, big = 2e9;
int t, n, a[N], mn = big;
bool bk, sk;
bool kong(){
	for(int i = 1; i <= 13; i++) if(a[i]) return false;
	if(bk) return false;
	if(sk) return false;
	return true;
}
void dfs(int cnt){
	if(cnt >= mn) return;
	if(kong()){
		mn = min(mn, cnt);
		return;
	}
	if(bk && sk){
		bk = false, sk = false;
		dfs(cnt+1);
		bk = true, sk = true;
	}
	for(int i = 1; i <= 13; i++){
		for(int j = 1; j <= 4; j++){
			if(a[i] >= j){
				a[i] -= j;
				dfs(cnt+1);
				a[i] += j;
			}
		}
	}
	for(int i = 1; i <= 13; i++){
		if(a[i] < 3) continue;
		for(int j = 1; j <= 13; j++){
			if(i == j) continue;
			if(a[j] >= 1){
				a[i] -= 3, a[j]--;
				dfs(cnt+1);
				a[i] += 3, a[j]++;
			}
			if(a[j] >= 2){
				a[i] -= 3, a[j] -= 2;
				dfs(cnt+1);
				a[i] += 3, a[j] += 2;
			}
		}
	}
	for(int i = 7; i <= 10; i++){
		if(a[i-4] && a[i-3] && a[i-2] && a[i-1] && a[i]){
			a[i-4]--, a[i-3]--, a[i-2]--, a[i-1]--, a[i]--;
			dfs(cnt+1);
			a[i-4]++, a[i-3]++, a[i-2]++, a[i-1]++, a[i]++;
		}
	}
	for(int i = 5; i <= 10; i++){
		if(a[i-2] >= 2 && a[i-1] >= 2 && a[i] >= 2){
			a[i-2] -= 2, a[i-1] -= 2, a[i] -= 2;
			dfs(cnt+1);
			a[i-2] += 2, a[i-1] += 2, a[i] += 2;
		}
	}
	for(int i = 3; i <= 10; i++){
		if(a[i-1] >= 3 && a[i] >= 3){
			a[i-1] -= 3, a[i] -= 3;
			dfs(cnt+1);
			a[i-1] += 3, a[i] += 3;
		}
	}
	for(int i = 1; i <= 13; i++){
		if(a[i] < 4) continue;
		for(int j = 1; j <= 13; j++){
			if(i == j || !a[j]) continue;
			for(int k = 1; k <= 13; k++){
				if(k == i || !a[k]) continue;
				a[i] -= 4, a[j]--, a[k]--;
				dfs(cnt+1);
				a[i] += 4, a[j]++, a[k]++;
			}
		}
	}
	int sum = 0;
	for(int i = 1; i <= 13; i++) sum += a[i];
	if(bk) sum++;
	if(sk) sum++;
	mn = min(mn, sum+cnt);
	return;
}
void solve(){
	mn = big;
	memset(a, 0, sizeof(a));
	bk = sk = false;
	cin >> n;
	for(int i = 1; i <= n; i++){
		int x, y; cin >> x >> y;
		if(x == 0){
			if(y == 1) sk = true;
			if(y == 0) bk = true;
			continue;
		}
		a[x]++;
	}
	dfs(0);
	cout << mn << "\n";
}
int main() {
    cin >> t;
    while(t--){
		solve();
	}
    return 0;
}
2025/8/30 20:38
加载中...