Help WA 75pts
查看原帖
Help WA 75pts
1191031
majingxuan123楼主2024/6/26 14:31
#include<iostream>
#include<cstring>
using namespace std;
int INF=0x7fffffff;
int t,n;
int cnt[20];
int ans;
void dfs(int x){
	if(x>=ans)return ;
	//顺子 
	int k;
	//单顺子 
	k=0; 
	for(int i=3;i<=14;i++){
		if(!cnt[i])k=0;
		else{
			k++;
			if(k>=5){
				for(int j=i-k+1;j<=i;j++)cnt[j]--;
				dfs(x+1);
				for(int j=i-k+1;j<=i;j++)cnt[j]++;
			}
		}
	}
	//双顺子 
	k=0; 
	for(int i=3;i<=14;i++){
		if(cnt[i]<2)k=0;
		else{
			k++;
			if(k>=3){
				for(int j=i-k+1;j<=i;j++)cnt[j]-=2;
				dfs(x+1);
				for(int j=i-k+1;j<=i;j++)cnt[j]+=2;
			}
		}
	}
	//三顺子 
	k=0; 
	for(int i=3;i<=14;i++){
		if(cnt[i]<3)k=0;
		else{
			k++;
			if(k>=2){
				for(int j=i-k+1;j<=i;j++)cnt[j]-=3;
				dfs(x+1);
				for(int j=i-k+1;j<=i;j++)cnt[j]+=3;
			}
		}
	}
	//带牌
	for(int i=3;i<=15;i++){
		if(cnt[i]>=3){
			cnt[i]-=3;
			//三带一
			for(int j=3;j<=17;j++){
				if(!cnt[j]||i==j)continue;
				cnt[j]--;
				dfs(x+1);
				cnt[j]++;
			}
			//三带二
			for(int j=3;j<=15;j++){
				if(cnt[j]<2||i==j)continue;
				cnt[j]-=2;
				dfs(x+1);
				cnt[j]+=2;
			}
			cnt[i]+=3;
		}
		if(cnt[i]>=4){
			cnt[i]-=4; 
			//四带二(单) 
			for(int j=3;j<=17;j++){
				if(!cnt[j]||i==j)continue;
				cnt[j]--;
				for(int k=3;k<=17;k++){
					if(!cnt[k])continue;
					cnt[k]--;
					dfs(x+1);
					cnt[k]++; 
				}
				cnt[j]++;
			}
			//四带二(对) 
			for(int j=3;j<=15;j++){
				if(cnt[j]<2||i==j)continue;
				cnt[j]-=2;
				for(int k=3;k<=15;k++){
					if(cnt[k]<2)continue;
					cnt[k]-=2;
					dfs(x+1);
					cnt[k]+=2; 
				}
				cnt[j]+=2;
			}
			cnt[i]-=4;
		}
	} 
	//火箭
	if(cnt[16]&&cnt[17]){
		x++;
	}
	else{
		if(cnt[16])x++;
		if(cnt[17])x++;
	}
	for(int i=3;i<=15;i++){
		//炸弹+单张牌+对子牌+三张牌 
		if(cnt[i])x++;
	}
	ans=min(ans,x);
}
int main(){
	cin>>t>>n;
	while(t--){
		memset(cnt,0,sizeof(cnt));
		for(int i=1;i<=n;i++){
			int a,b;
			cin>>a>>b;
			if(a==0&&b==1)cnt[16]++;
			else if(a==0&&b==2)cnt[17]++;
			else if(a==1)cnt[14]++;
			else if(a==2)cnt[15]++;
			else cnt[a]++;
		}
		ans=INF;
		dfs(0);
		cout<<ans<<endl;
	}
	return 0;
} 
2024/6/26 14:31
加载中...