TLE on #11 #13
查看原帖
TLE on #11 #13
553673
ygkl9698楼主2023/8/24 14:59
#include<bits/stdc++.h>
using namespace std;
int T,n,minn=0x3f3f3f3f;
int a[20];
void dfs(int n,int x){
	if(x>=minn) return ;
	if(n==0){
		minn=min(minn,x);
		return ;
	}
	int maxx=0; 
	for(int i=2;i<=14;i++){
		if(a[i]<3) continue;
		a[i]-=3;
		dfs(n-3,x+1);
		for(int j=2;j<=16;j++){
			if(a[j]<1||i==j) continue;
			a[j]--;
			dfs(n-4,x+1);
			a[j]++;
		}
		for(int j=2;j<=14;j++){
			if(a[j]<2||i==j) continue;
			a[j]-=2;
			dfs(n-5,x+1);
			a[j]+=2;
		}
		a[i]+=3;
	}
	maxx=0; 
	for(int i=3;i<=14;i++){
		if(a[i]<3)
			maxx=0;
		else{
			maxx++;
			if(maxx>=2){
				for(int j=i;j>=i-maxx+1;j--) a[j]-=3;
				dfs(n-maxx*3,x+1);
				for(int j=i;j>=i-maxx+1;j--) a[j]+=3;
			}
		}
	}
	maxx=0;
	for(int i=3;i<=14;i++){
		if(a[i]==0)
			maxx=0;
		else{
			maxx++;
			if(maxx>=5){
				for(int j=i;j>=i-maxx+1;j--) a[j]--;
				dfs(n-maxx,x+1);
				for(int j=i;j>=i-maxx+1;j--) a[j]++;
			}
		}
	}
	maxx=0; 
	for(int i=3;i<=14;i++){
		if(a[i]<2)
			maxx=0;
		else{
			maxx++;
			if(maxx>=3){
				for(int j=i;j>=i-maxx+1;j--) a[j]-=2;
				dfs(n-maxx*2,x+1);
				for(int j=i;j>=i-maxx+1;j--) a[j]+=2;
			}
		}
	}
	for(int i=2;i<=14;i++){
		if(a[i]<4) continue;
		a[i]-=4;
		for(int j=2;j<=16;j++){
			if(a[j]==0) continue;
			a[j]--;
			for(int k=2;k<=16;k++){
				if(a[k]==0) continue;
				a[k]--;
				dfs(n-6,x+1);
				a[k]++;
			}
			a[j]++;
		}
		for(int j=2;j<=14;j++){
			if(a[j]<2) continue;
			a[j]-=2;
			for(int k=2;k<=14;k++){
				if(a[k]<2) continue;
				a[k]-=2;
				dfs(n-6,x+1);
				a[k]+=2;
			}
			a[j]+=2;
		}
		a[i]+=4;
	}
	for(int i=2;i<=14;i++){
		if(a[i]>=2){
			a[i]-=2;
			dfs(n-2,x+1);
			a[i]+=2;
		}
	}
	if(a[15]!=0&&a[16]!=0){
		a[15]--,a[16]--;
		dfs(n-2,x+1);
		a[15]++,a[16]++;
	}
	int y=x;
	for(int i=2;i<=16;i++){
		if(a[i]!=0){
			y++;
		}
	}
	dfs(0,y);
}
int main(){
	cout.tie(0);
	cin>>T>>n;
	while(T--){
		memset(a,0,sizeof(a));
		minn=0x3f3f3f3f;
		for(int i=1,x,y;i<=n;i++){
			cin>>x>>y;
			if(x!=0&&x!=1) a[x]++;
			else if(x==1) a[14]++;
			else a[14+y]++;
		}
		dfs(n,0);
		cout<<minn<<endl;
	}
	return 0;
}

悬关,感谢

2023/8/24 14:59
加载中...