求大佬,0pts,TLE+WA,样例2等了几秒钟还输出了错误的答案
查看原帖
求大佬,0pts,TLE+WA,样例2等了几秒钟还输出了错误的答案
658786
STUDENT00楼主2022/8/27 11:53

代码如下:

#include<bits/stdc++.h>
using namespace std;
int t,n,a,b,num[20],ans;
bool flag;
void dfs(int deep){
	if(deep>=ans) return;
	bool q=1;
	for(int i=0;i<=12;i++){
		if(num[i]){
			q=0;
			break;
		}
	}
	if(q){
		ans=deep;
		return;
	}
	for(int i=0;i<=12;i++){
		if(num[i]>=4){
			num[i]-=4;
			dfs(deep+1);
			num[i]+=4;
		}
	}
	for(int i=0;i<=12;i++){
		if(num[i]){
			num[i]--;
			dfs(deep+1);
			num[i]++;
		}
	}
	for(int i=0;i<=12;i++){
		if(num[i]>=2){
			num[i]-=2;
			dfs(deep+1);
			num[i]+=2;
		}
	}
	for(int i=0;i<=12;i++){
		if(num[i]>=3){
			num[i]-=3;
			dfs(deep+1);
			num[i]+=3;
		}
	}
	for(int i=0;i<=12;i++){
		if(num[i]>=3){
			num[i]-=3;
			for(int j=0;j<=12;j++){
				if(i!=j&&num[j]){
					num[j]--;
					dfs(deep+1);
					num[j]++;
				}
			}
			num[i]+=3;
		}
	}
	for(int i=0;i<=12;i++){
		if(num[i]>=3){
			num[i]-=3;
			for(int j=0;j<=12;j++){
				if(i!=j&&num[j]>=2){
					num[j]-=2;
					dfs(deep+1);
					num[j]+=2;
				}
			}
			num[i]+=3;
		}
	}
	int s=0;
	for(int i=0;i<=11;i++){
		if(num[i]){
			s++;
			if(s>=5){
				int k=i;
				while(k>=0&&num[k]){
					num[k]--;
					k--;
				}
				dfs(deep+1);
				for(int j=k+1;j<=i;j++) num[j]++;
			}
		}else s=0;
	}
	s=0;
	for(int i=0;i<=11;i++){
		if(num[i]>=2){
			s++;
			if(s>=3){
				int k=i;
				while(k>=0&&num[k]>=2){
					num[k]-=2;
					k--;
				}
				dfs(deep+1);
				for(int j=k+1;j<=i;j++) num[j]+=2;
			}
		}else s=0;
	}
	s=0;
	for(int i=0;i<=11;i++){
		if(num[i]>=3){
			s++;
			if(s>=2){
				int k=i;
				while(k>=0&&num[k]>=3){
					num[k]-=3;
					k--;
				}
				dfs(deep+1);
				for(int j=k+1;j<=i;j++) num[j]+=3;
			}
		}else s=0;
	}
	for(int i=0;i<=12;i++){
		if(num[i]>=4){
			num[i]-=4;
			for(int j=0;j<=12;j++){
				if(i!=j&&num[j]){
					num[j]--;
					for(int z=0;z<=12;z++){
						if(i!=z&&j!=z&&num[z]){
							num[z]--;
							dfs(deep+1);
							num[z]++;
						}
					}
					num[j]++;
				}
			}
			num[i]+=4;
		}
	}
	for(int i=0;i<=12;i++){
		if(num[i]>=4){
			num[i]-=4;
			for(int j=0;j<=12;j++){
				if(i!=j&&num[j]>=2){
					num[j]-=2;
					for(int z=0;z<=12;z++){
						if(i!=z&&j!=z&&num[z]>=2){
							num[z]-=2;
							dfs(deep+1);
							num[z]+=2;
						}
					}
					num[j]+=2;
				}
			}
			num[i]+=4;
		}
	}
}
int main(){
	scanf("%d%d",&t,&n);
	while(t--){
		flag=0;
		ans=1e9;
		memset(num,0,sizeof(num));
		for(int i=1;i<=n;i++){
			scanf("%d%d",&a,&b);
			if(!a) flag=1;
			else{
				if(a>=3&&a<=13) num[a-3]++;
				else if(a==1) num[11]++;
				else num[12]++;
			}
		}
		dfs(0);
		printf("%d\n",ans);
	}
	return 0;
}
2022/8/27 11:53
加载中...