98pts WA on test 31 求调
查看原帖
98pts WA on test 31 求调
524091
dami826楼主2024/10/18 14:08
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,s[20],minn=300;
void dfs(int x,int remain,int now){
//	for(int j=1;j<=15;j++){
//		printf("%lld ",s[j]);
//	}
//	printf("\n");
//	printf("%lld %lld %lld %lld\n",x,remain,now,s[now]);
	//递归边界
	//剪枝 
	if(x>minn){
		return;
	}
	//打完了 
	if(remain==0){
		minn=min(minn,x);
		return;
	}
	//下一个 
	if(!s[now]){
		dfs(x,remain,now+1);
		return;
	}
	//小王,一直出王炸出完接着一张一张出 
	if(now==14){
		if(s[15]&&s[14]){
			s[15]--;
			s[14]--;
//			printf("jokerboom\n");
			dfs(x+1,remain-2,now);
//			printf("return\n");
			s[15]++;
			s[14]++;
		}
		else{
			s[14]--;
//			printf("ljoker\n");
			dfs(x+1,remain-1,now);
//			printf("return\n");
			s[14]++;
		} 
		return;
	}
	//大王,一张一张出 
	if(now==15){
		s[15]--;
//		printf("bjoker\n");
		dfs(x+1,remain-1,now);
//		printf("return\n");
		s[15]++;
		return;
	}
	//4+2+2 4+1+1 4
	if(s[now]>=4){
		//4+2+2 
		for(int i=now;i<=13;i++){
			if(i==now){
				if(s[i]<6){
					continue;
				}
			}
			for(int j=i;j<=13;j++){
				if(j==now){
					if(i==now){
						if(s[i]<8){
							continue;
						}
					}
					else{
						if(s[i]<6){
							continue;
						}
					}
				}
				if(i==j&&s[i]>=4||i!=j&&s[i]>=2&&s[j]>=2){
					s[i]-=2;
					s[j]-=2;
					s[now]-=4;
//					printf("422 %lld %lld %lld\n",now,i,j);
					dfs(x+1,remain-8,now);
//					printf("return\n");
					s[i]+=2;
					s[j]+=2;
					s[now]+=4; 
				}
			}
		}
		//4+1+1
		for(int i=now;i<=15;i++){
			if(i==now){
				if(s[i]<5){
					continue;
				}
			}
			for(int j=i;j<=15;j++){
				if(j==now){
					if(i==now){
						if(s[i]<6){
							continue;
						}
					}
					else{
						if(s[i]<5){
							continue;
						}
					}
				}
				if(i==j&&s[i]>=2||i!=j&&s[i]>=1&&s[j]>=1){
					s[i]--;
					s[j]--;
					s[now]-=4;
//					printf("411 %lld %lld %lld\n",now,i,j);
					dfs(x+1,remain-6,now);
//					printf("return\n");
					s[i]++;
					s[j]++;
					s[now]+=4; 
				}
			}
		} 
		//4
		s[now]-=4;
//		printf("4 %lld\n",now);
		dfs(x+1,remain-4,now);
//		printf("return\n");
		s[now]+=4;
	} 
	//3+3+3+...... 3+2 3+1 3
	if(s[now]>=3){
		//3+3+3+......
		int r=now+1;
		for(;r<=12;r++){
			if(s[r]<3){
				break;
			}
		}
		r--;
		if(r-now>=1){
			for(int i=r;i>=now+1;i--){
				for(int j=now;j<=i;j++){
					s[j]-=3;
				}
//				printf("33... %lld %lld\n",now,i);
				dfs(x+1,remain-(i-now+1)*3,now);
//				printf("return\n");
				for(int j=now;j<=i;j++){
					s[j]+=3;
				}
			}
		}
		//3+2
		for(int i=now;i<=13;i++){
			if(i!=now&&s[i]>=2||i==now&&s[i]>=5){
				s[i]-=2;
				s[now]-=3;
//				printf("32 %lld %lld\n",now,i);
				dfs(x+1,remain-5,now);
//				printf("return\n");
				s[i]+=2;
				s[now]+=3; 
			}
		}
		//3+1
		for(int i=now;i<=15;i++){
			if(i!=now&&s[i]>=1||i==now&&s[i]>=4){
				s[i]-=1;
				s[now]-=3;
//				if((now==2||now==9)&&(i==11||i==14)){
//					printf("-----------------------------------------------------------------\n");
//				}
//				printf("31 %lld %lld\n",now,i);
				dfs(x+1,remain-4,now);
//				printf("return\n");
				s[i]+=1;
				s[now]+=3; 
			}
		}
		//3
		s[now]-=3;
//		printf("3 %lld\n",now);
		dfs(x+1,remain-3,now);
//		printf("return\n");
		s[now]+=3; 
	} 
	//2+2+2+...... 4+2+2 3+2 2
	if(s[now]>=2){
		//2+2+2+......
		int r=now+1;
		for(;r<=12;r++){
			if(s[r]<2){
				break;
			}
		}
		r--;
		if(r-now>=2){
			for(int i=r;i>=now+2;i--){
				for(int j=now;j<=i;j++){
					s[j]-=2;
				}
//				for(int j=1;j<=15;j++){
//					printf("%lld ",s[j]);
//				}
//				printf("\n");
//				printf("%lld %lld %lld\n",x+1,remain-(i-now+1)*2,now);
//				printf("22... %lld %lld\n",now,i);
				dfs(x+1,remain-(i-now+1)*2,now);
//				printf("return\n");
				for(int j=now;j<=i;j++){
					s[j]+=2;
				}
			}
		}
		//4+2+2
		for(int i=now+1;i<=13;i++){
			for(int j=now+1;j<=13;j++){
				if(i==j&&s[i]>=6||i!=j&&s[i]>=4&&s[j]>=2){
					s[i]-=4;
					s[j]-=2;
					s[now]-=2;
//					printf("422 %lld %lld %lld\n",i,j,now);
					dfs(x+1,remain-8,now);
//					printf("return\n");
					s[i]+=4;
					s[j]+=2;
					s[now]+=2;
				}
			}
		} 
		//3+2
		for(int i=now+1;i<=13;i++){
			if(s[i]>=3){
				s[i]-=3;
				s[now]-=2;
//				printf("32 %lld %lld\n",i,now);
				dfs(x+1,remain-5,now);
//				printf("return\n");
				s[i]+=3;
				s[now]+=2;
			}
		} 
		//2
		s[now]-=2;
//		printf("2 %lld\n",now);
		dfs(x+1,remain-2,now);
//		printf("return\n");
		s[now]+=2; 
	} 
	//1+1+1+... 4+1+1 3+1 1
	if(s[now]>=1){
		int r=now+1;
		for(;r<=12;r++){
			
			if(s[r]<1){
				break;
			}
		}
		r--;
//		printf("%lld %lld\n",r,now);
		if(r-now>=4){
			for(int i=r;i>=now+4;i--){
				for(int j=now;j<=i;j++){
					s[j]--;
				}
//				printf("11... %lld %lld\n",now,i);
				dfs(x+1,remain-(i-now+1),now);
//				printf("return\n");
				for(int j=now;j<=i;j++){
					s[j]++;
				}
			}
		}
		//4+1+1
		for(int i=now+1;i<=15;i++){
			for(int j=now+1;j<=15;j++){
				if(i==j&&s[i]>=5||i!=j&&s[i]>=4&&s[j]>=1){
					s[i]-=4;
					s[j]--;
					s[now]--;
//					printf("411 %lld %lld %lld\n",i,j,now);
					dfs(x+1,remain-6,now);
//					printf("return\n");
					s[i]+=4;
					s[j]++;
					s[now]++;
				}
			}
		}
		//3+1
		for(int i=now+1;i<=15;i++){
			if(s[i]>=3){
				s[i]-=3;
				s[now]--;
//				printf("31 %lld %lld\n",i,now);
				dfs(x+1,remain-4,now);
//				printf("return\n");
				s[i]+=3;
				s[now]++;
			}
		} 
		//1
		s[now]--;
//		printf("1 %lld\n",now);
		dfs(x+1,remain-1,now);
//		printf("return\n");
		s[now]++; 
	}
}
signed main(){
	scanf("%lld %lld",&t,&n);
	while(t--){
		minn=300;
		memset(s,0,sizeof(s)); 
		for(int i=1;i<=n;i++){
			int color,digit;
			scanf("%lld %lld",&digit,&color);
			//牌面转换,规则见程序末端 
			switch(digit){
				case 0:digit+=(color+13);break;
				case 1:case 2:digit+=11;break;
				default:digit-=2;break;
			}
//			printf("digit %lld\n",digit);
			s[digit]++;
//			for(int j=1;j<=15;j++){
//				printf("%lld ",s[j]);
//			}
//			printf("\n");
		}
		dfs(0,n,1);
		printf("%lld\n",minn);
	}
	return 0;
} 
/* 
数码转换 
before		after
3 			1
4 			2
5 			3
6 			4
7 			5
8 			6
9 			7
10 			8
J 			9
Q 			10
K 			11
A 			12
2 			13
LITTLE JOKER 14
BIG J0KER	 15
*/
2024/10/18 14:08
加载中...