求助,WA#29,TLE#25 27 37 38 41 42
查看原帖
求助,WA#29,TLE#25 27 37 38 41 42
196522
HuaJi_360楼主2021/8/5 15:19
#include<bits/stdc++.h>
#define reg register int
#define ll long long
using namespace std;
template <typename T> inline void read(T &x){
	x=0;
	char c=getchar();bool flg=0;
	for(;!isdigit(c);c=getchar()){if(c=='-'){flg=1;}}
	for(;isdigit(c);c=getchar()){x=(x<<1)+(x<<3)+c-'0';}
	if(flg){x=-x;}
}
template<typename T> inline void write(T x){
	char F[200];
	register T cnt=0,tmp=x>0?x:-x;
	if(tmp==0){putchar('0');return;}
	if(x<0){putchar('-');}
	while(tmp>0){
		F[cnt++]=tmp%10+'0';
		tmp/=10;
	}
	while(cnt>0){putchar(F[--cnt]);}
}
int T,n,ans,sum[25];
void dfs(int x){
	if(x>=ans){return;}
	int k=0;
	for(reg i=3;i<=14;i++){//顺子
		if(sum[i]==0){k=0;}
		else{
			k++;
			if(k>=5){
				for(reg j=i;j>=i-k+1;j--){sum[j]--;}
				dfs(x+1);
				for(reg j=i;j>=i-k+1;j--){sum[j]++;}
			}
		}
	}
	k=0;
	for(reg i=3;i<=14;i++){//连对
		if(sum[i]<=1){k=0;}
		else{
			k++;
			if(k>=3){
				for(reg j=i;j>=i-k+1;j--){sum[j]-=2;}
				dfs(x+1);
				for(reg j=i;j>=i-k+1;j--){sum[j]+=2;}
			}
		}
	}
	k=0;
	for(reg i=3;i<=14;i++){//三连
		if(sum[i]<=2){k=0;}
		else{
			k++;
			if(k>=2){
				for(reg j=i;j>=i-k+1;j--){sum[j]-=3;}
				dfs(x+1);
				for(reg j=i;j>=i-k+1;j--){sum[j]+=3;}
			}
		}
	}
	for(reg i=2;i<=14;i++){
		if(sum[i]<=3){
			if(sum[i]<=2){continue;}
			sum[i]-=3;//三带
			for(reg j=2;j<=15;j++){//一
				if(sum[j]<=0||j==i){continue;}
				sum[j]--;
				dfs(x+1);
				sum[j]++;
			}
			for(reg j=2;j<=14;j++){//二
				if(sum[j]<=1||j==i){continue;}
				sum[j]-=2;
				dfs(x+1);
				sum[j]+=2;
			}
			sum[i]+=3;
		}else{
			sum[i]-=3;//三带
			for(reg j=2;j<=15;j++){//一
				if(sum[j]<=0||j==i){continue;}
				sum[j]--;
				dfs(x+1);
				sum[j]++;
			}
			for(reg j=2;j<=14;j++){//二
				if(sum[j]<=1||j==i){continue;}
				sum[j]-=2;
				dfs(x+1);
				sum[j]+=2;
			}
			sum[i]+=3;
			sum[i]-=4;//四带
			for(reg j=2;j<=15;j++){//二单
				if(sum[j]<=0||j==i){continue;}
				sum[j]--;
				for (int k=2;k<=15;k++){
					if(sum[k]<=0||j==k){continue;}
					sum[k]--;
					dfs(x+1);
					sum[k]++;
				}
				sum[j]++;
			}
			for(reg j=2;j<=14;j++){//二对
				if(sum[j]<=1||j==i)continue;
				sum[j]-=2;
				for(reg k=2;k<=14;k++){
					if(sum[k]<=1)continue;
					sum[k]-=2;
					dfs(x+1);
					sum[k]+=2;
				}
				sum[j]+=2;
			}
			sum[i]+=4;
		}
	}
	for(reg i=2;i<=15;i++){
		if(sum[i]){x++;}
	}
	ans=min(ans,x);
}
int main(){
	freopen("P2540.in","r",stdin);
	read(T),read(n);
	while(T--){
		ans=INT_MAX;
		int x,y;
		memset(sum,0,sizeof(sum));
		for(reg i=1;i<=n;i++){
			read(x),read(y);
			if(x==0){sum[15]++;}
			else if(x==1){sum[14]++;}
		    else{sum[x]++;}
		}
		dfs(0);
		write(ans),putchar('\n');
	}
}

2021/8/5 15:19
加载中...