萌新求助(悬赏1关注)
查看原帖
萌新求助(悬赏1关注)
1066676
12345asdf楼主2023/12/30 17:57

样例都过了,但是飘零。 求dalao帮改一下

#include<bits/stdc++.h>
using namespace std;
int card[20],ans=1e9;
void cp(int step,int num){
	//cout<<step<<" "<<num<<"\n";
	if(step>=ans)return;
	if(num<=0){
		ans=min(step,ans);
		return;
	}
	//4带2(对) 
	for(int i=1;i<=13;i++){
		if(card[i]>=4){
			card[i]-=4;
			for(int j=0;j<=13;j++){
				if(card[j]>=2){
					card[j]-=2;
					for(int k=0;k<=13;k++){
						if(card[k]>=2){
							card[k]-=2;
							cp(step+1,num-8);
							card[k]+=2;
						}	
					}
					card[j]+=2;
				}	
			}
			card[i]+=4;
		}
	}
	//4带2(单) 
	for(int i=1;i<=13;i++){
		if(card[i]>=4){
			card[i]-=4;
			for(int j=0;j<=13;j++){
				if(card[j]>=1){
					card[j]-=1;
					for(int k=0;k<=13;k++){
						if(card[k]>=1){
							card[k]-=1;
							cp(step+1,num-6);
							card[k]+=1;
						}	
					}
					card[j]+=1;
				}	
			}
			card[i]+=4;
		}
	}
	//单顺子 
	for(int i=1;i<=8;i++){
		if(card[i]){
			int a=i,zs=1;
			card[i]--;
			int cnt=1;
			for(int j=i+1;j<=12;j++){
				if(!card[j]){
					break;
				}
				card[j]--;
				cnt++;
				if(cnt>=5){
					cp(step+1,num-cnt);
				}
			}
			for(int j=i;j<=i+cnt-1;j++)card[j]++;
		}
	} 
	
	//双顺子
	for(int i=1;i<=10;i++){
		if(card[i]>=2){
			int a=i,zs=1;
			card[i]--;
			int cnt=1;
			for(int j=i+1;j<=12;j++){
				if(card[j]<2){
					break;
				}
				card[j]-=2;
				cnt++;
				if(cnt>=3){
					cp(step+1,num-2*cnt);
				}
			}
			for(int j=i;j<=i+cnt-1;j++)card[j]++;
		}
	}
	//三顺子
	for(int i=1;i<=11;i++){
		if(card[i]>=3){
			int a=i,zs=1;
			card[i]--;
			int cnt=1;
			for(int j=i+1;j<=12;j++){
				if(card[j]<3){
					break;
				}
				card[j]-=3;
				cnt++;
				if(cnt>=2){
					cp(step+1,num-3*cnt);
				}
			}
			for(int j=i;j<=i+cnt-1;j++)card[j]++;
		}
	}
	//三带二
	for(int i=1;i<=13;i++){
		if(card[i]>=3){
			card[i]-=3;
			for(int j=0;j<=13;j++){
				if(card[j]>=2){
					card[j]-=2;
					cp(step+1,num-5);
					card[j]+=2; 
				}	
			}
			card[i]+=3;
		}
	}
	//三带一 
	for(int i=1;i<=13;i++){
		if(card[i]>=3){
			card[i]-=3;
			for(int j=0;j<=13;j++){
				if(card[j]){
					card[j]--;
					cp(step+1,num-4);
					card[j]++; 
				}	
			}
			card[i]+=3;
		}
	}
	//单出1,2,3,4
	int cc=0,cnt=0;
	for(int i=0;i<=13;i++){
		if(card[i]){
			cc++;
		}
	}
	cp(step+cc,0);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int T,n;
	cin>>T>>n;
	while(T--){
	for(int i=0;i<=20;i++){
		card[i]=0;
	}
	for(int i=1;i<=n;i++){
			int a,b;
			cin>>a>>b;
			if(a>=3)a-=2;
			if(a==1)a=12;
			if(a==2)a=13;
			card[a]++;
		}
		ans=1e9;
		cp(0,n);
		cout<<ans<<"\n";
	} 
	return 0;
}

2023/12/30 17:57
加载中...