95 pts 求调
查看原帖
95 pts 求调
631550
liuziqin楼主2024/7/23 11:58

tle on #13

#include<bits/stdc++.h>
#define int short int
using namespace std;
int T,n,sum[30];
int ans=13;
int a,b;
inline int min(int x,int y){
	return x<y?x:y;
}
void dfs(int step){
	if(step>=ans)return ;
	int k=0;
	for(int i=3;i<=14;i++){
		if(!sum[i])k=0;
		else {
			k++;
			if(k>=5){
				for(int j=i-k+1;j<=i;j++)sum[j]--;
				dfs(step+1);
				for(int j=i-k+1;j<=i;j++)sum[j]++; 
			}
		}
	}//单顺子
	k=0;
	for(int i=3;i<=14;i++){
		if(sum[i]<2)k=0;
		else {
			k++;
			if(k>=3){
				for(int j=i-k+1;j<=i;j++)sum[j]-=2;
				dfs(step+1);
				for(int j=i-k+1;j<=i;j++)sum[j]+=2;
			}
		}
	}//双顺子
	k=0;
	for(int i=3;i<=14;i++){
		if(sum[i]<3)k=0;
		else {
			k++;
			if(k>=3){
				for(int j=i-k+1;j<=i;j++)sum[j]-=3;
				dfs(step+1);
				for(int j=i-k+1;j<=i;j++)sum[j]+=3;
			}
		}
	} //三顺子
	k=0;
	for(int i=2;i<=14;i++){
		if(sum[i]>=3){
			sum[i]-=3;
			for(int j=2;j<=15;j++){
				if(j==i)continue;
				if(sum[j]){
					sum[j]--;
					dfs(step+1);
					sum[j]++;
				}
			}
			sum[i]+=3;
		}
	} //三带一
	for(int i=2;i<=14;i++){
		if(sum[i]>=3){
			sum[i]-=3;
			for(int j=2;j<=14;j++){
				if(j==i)continue;
				if(sum[j]>=2){
					sum[j]-=2;
					dfs(step+1);
					sum[j]+=2;
				}
			}
			sum[i]+=3;
		}
	} //三带二
	for(int i=2;i<=14;i++){
		if(sum[i]>=4){
			sum[i]-=4;
			for(int j=2;j<=15;j++){
				if(j==i)continue;
				if(sum[j]>=1){
					sum[j]--;
					for(int l=2;l<=15;l++){
						if(l==j||l==i)continue;
						if(sum[l]){
							sum[l]--;
							dfs(step+1);
							sum[l]++;
						}
					}
					sum[j]++;
				}
			}
			for(int j=2;j<=14;j++){
				if(j==i)continue;
				if(sum[j]>=2){
					sum[j]-=2;
					for(int l=2;l<=14;l++){
						if(l==j||l==i)continue;
						if(sum[l]>=2){
							sum[l]-=2;
							dfs(step+1);
							sum[l]+=2;
						}
					}
					sum[j]+=2;
				}
			}
			sum[i]+=4;
		}
	} //四带二 
	for(int i=2;i<=14;i++){
		if(sum[i]>=4){
			sum[i]-=4;
			dfs(step+1);
			sum[i]+=4;
		}
	}//炸弹 
	for(int i=2;i<=14;i++){
		if(sum[i]>=3){
			sum[i]-=3;
			dfs(step+1);
			sum[i]+=3;
		}
	} //三张牌
	for(int i=2;i<=14;i++){
		if(sum[i]>=2){
			sum[i]-=2;
			dfs(step+1);
			sum[i]+=2;
		}
	} //对子牌
	if(sum[15]&&sum[16]){
		sum[15]--,sum[16]--;
		dfs(step+1);
		sum[15]++,sum[16]++;
	}//火箭 
	int res=0;
	for(int i=2;i<=16;i++){
		res+=sum[i];
	}//单张牌
	ans=min(ans,res+step);
}
void solve(){
	for(int i=2;i<=16;i++)sum[i]=0;
	ans=40;
	for(int i=1;i<=n;i++){
		cin>>a>>b;
		if(a==0&&b==1)sum[15]++;
		else if(a==0&&b==2)sum[16]++;
		else if(a==1)sum[14]++;
		else sum[a]++;
	}
	dfs(0);
	cout<<ans<<"\n";
}
signed main(){
	cin>>T>>n;
	for(int i=1;i<=T;i++)solve(); 
	return 0;
}
2024/7/23 11:58
加载中...