为什么是随机RE
查看原帖
为什么是随机RE
302153
DovFrcm楼主2021/10/9 19:04
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int t[200005];
int ans = 0;

int XYJ(){
	int s, f;
	cin >> s >> f;
	if(s == 0){
		return f == 1 ? 14 : 15;
	}else if(s == 1){
		return 12;
	}else if(s == 2){
		return 13;
	}else{
		return s - 2;
	}
}

void dfs(int x, int sum){
	if(x == 0){
		ans = min(ans, sum);
		return ;
	}
	
	int l, r, bg = 0;
	
	int xx = 0, d = -1;
	
	for(int i = 1; i <= 12; i++){
		if(t[i]){
			if(d == -1)d = i;
			xx++;
		}else{
			if(xx > bg){
				bg = xx;
				l = d;
				r = i - 1;
			}
			xx = 0;
			d = -1;
		}
	}
	
	bool _3 = 1, _2 = 1;
	for(int i = l; i <= r; i++){
		if(t[i] < 3){
			_3 = 0;
		}
		if(t[i] < 2){
			_2 = 0;
		}
	}
	if(_3 && bg >= 2){//Èý˳ 
		for(int i = l; i <= r; i++){
			t[i] -= 3;
		}
		dfs(x - 3 * (r - l + 1), sum + 1);
		for(int i = l; i <= r; i++){
			t[i] += 3;
		}
	}else if(_2 && bg >= 3){//¶þ˳ 
		for(int i = l; i <= r; i++){
			t[i] -= 2;
		}
		dfs(x - 2 * (r - l + 1), sum + 1);
		for(int i = l; i <= r; i++){
			t[i] += 2;
		}
	}else if(bg >= 5){//µ¥Ë³ 
		for(int i = l; i <= r; i++){
			t[i]--;
		}
		dfs(x - (r - l + 1), sum + 1);
		for(int i = l; i <= r; i++){
			t[i]++;
		}
	}
	
	for(int k = 1; k <= 15; k++){
		if(t[k] >= 4){
			t[k] -= 4;
			//ËÄ´ø¶þ 
			for(int i = 1; i <= 15; i++){
				for(int j = 1; j <= 15; j++){
					if((i == j && t[i] < 2) || !t[i] || !t[j]){
						continue;
					}
					t[i]--;t[j]--;
					dfs(x - 6, sum + 1);
					t[i]++;t[j]++;
				}
			}
			
			//Õ¨µ¯ 
			dfs(x - 4, sum + 1);
			
			t[k] += 4;
		}

		if(t[k] >= 3){
			t[k] -= 3;
			
			//Èý´ø¶þ 
			for(int i = 1; i <= 15; i++){
				if(t[i] < 2){
					continue;
				}
				t[i]-= 2;
				dfs(x - 5, sum + 1);
				t[i]+= 2;
			}
			
			//Èý´øÒ» 
			for(int i = 1; i <= 15; i++){
				if(!t[i]){
					continue;
				}
				t[i]--;
				dfs(x - 4, sum + 1);
				t[i]++;
			}
			
			//µ¥Èý 
			dfs(x - 3, sum + 1);
			
			t[k] += 3;
		}
		
		//¶Ô×Ó 
		if(t[k] >= 2){
			t[k] -= 2;
			dfs(x - 2, sum + 1);
			t[k] += 2;
		}
		
		//µ¥ÅÆ 
		if(t[k] >= 1){
			t[k]--;
			dfs(x - 1, sum + 1);
			t[k]++;
		}
	}
	
	if(t[15] >= 1 && t[14] >= 1){
		t[15]--;t[14]--;
		dfs(x - 2, sum + 1);
		t[15]++;t[14]++;
	}
	
}

int main(){
	int n, T;
	cin >> T >> n;
	while(T--){
		ans = 1145141919;
		for(int i = 1; i <= n; i++){
			a[i] = XYJ();
			t[a[i]]++;
		}
		
		dfs(n, 0);
		
		cout << ans << endl;
		
		for(int i = 0; i <= 15; i++){
			t[i] = 0;
		}
	}
	return 0;
}

提交后一会25一会20一会15一会10

2021/10/9 19:04
加载中...