社区讨论

88pts,TLE,萌新求助

P2540[NOIP 2015 提高组] 斗地主 加强版参与者 6已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@lo23x15c
此快照首次捕获于
2023/10/23 07:35
2 年前
此快照最后确认于
2023/11/03 07:55
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int ans,b[30],T,n;
void dfs(int x){
    if(x>=ans) return;
	int k=0;
	for(int i=3;i<=14;i++){
		if(b[i]<1) k=0;
		else {
			k++;
			if(k>=5){
				for(int j=i;j>=i-k+1;j--)b[j]--;
				dfs(x+1);
				for(int j=i;j>=i-k+1;j--)b[j]++;
			}
		}
	}
	k=0;
	for(int i=3;i<=14;i++){
		if(b[i]<2) k=0;
		else {
			k++;
			if(k>=3){
				for(int j=i;j>=i-k+1;j--)b[j]-=2;
				dfs(x+1);
				for(int j=i;j>=i-k+1;j--)b[j]+=2;
			}
		}
	}
	k=0;
	for(int i=3;i<=14;i++){
		if(b[i]<3) k=0;
		else {
			k++;
			if(k>=2){
				for(int j=i;j>=i-k+1;j--)b[j]-=3;
				dfs(x+1);
				for(int j=i;j>=i-k+1;j--)b[j]+=3;
			}
		}
	}
	
	for(int i=2;i<=14;i++){
		if(b[i]<=3){
			if(b[i]<=2)continue;
			b[i]-=3;
			for(int j=2;j<=15;j++){
				if(b[j]<1||i==j)continue;
				b[j]--;
				dfs(x+1);
				b[j]++;
			} //带单 
			for(int j=2;j<=14;j++){
				if(b[j]<2||i==j)continue;
				b[j]-=2;
				dfs(x+1);
				b[j]+=2;
			} //double 
		b[i]+=3;
	}
	else {
		b[i]-=3;
		for(int j=2;j<=15;j++){
			if(b[j]<1||i==j)continue;
			b[j]--;
			dfs(x+1);
			b[j]++;
		} //带单 
		for(int j=2;j<=14;j++){
			if(b[j]<2||i==j)continue;
			b[j]-=2;
			dfs(x+1);
			b[j]+=2;
		} //double 
		b[i]+=3;
		b[i]-=4;
		for(int j=2;j<=15;j++){
			if(b[j]<1)continue;
			b[j]--;
			for(int k=2;k<=15;k++){
				if(b[k]<1)continue;
				b[k]--;
				dfs(x+1);
				b[k]++;
			} //带单 
			b[j]++;
		}			
		for(int j=2;j<=14;j++){
			if(b[j]<2)continue;
			b[j]-=2;
			for(int k=2;k<=14;k++){
				if(b[k]<2)continue;
				b[k]-=2;
				dfs(x+1);
				b[k]+=2;
			} 
			b[j]+=2;
		}
		b[i]+=4;
	}
}
	for(int i=2;i<=15;i++)if(b[i]!=0)x++;
	ans=min(ans,x); 
}
void read(int &x){
	int f=1;x=0;char s=getchar();
	while(s<'0'||s>'9') {if(s=='-') f=-1;s=getchar();}
	while(s>='0'&&s<='9') {x=x*10+s-'0';s=getchar();}
	x*=f;
}
int main(){
	cin>>T>>n;
	while(T--){
		ans=114514;
		memset(b,0,sizeof(b));
		for(int i=1;i<=n;i++){
			int a,useless;
			read(a);
			read(useless);
			if(a==1)b[14]++;
			else if(a==0)b[15]++;
			else b[a]++;
		}
		dfs(0);
		cout<<ans<<endl;
	}
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...