豆递主80分,快调吐了呀
查看原帖
豆递主80分,快调吐了呀
448965
杨丶老爹楼主2021/10/9 10:31

代码附上

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int num[20],n,t,ans;
void dfs(int cnt)
{
	if(cnt>=ans) return;
	int k=0;
	for(int i=3;i<=14;i++)   //单顺 
	{
		if(num[i]==0) k=0;
		else
		{
			k++;
			if(k>=5)
			{
				for(int j=i;j>=i-k+1;j--) num[j]--;
				dfs(cnt+1);
				for(int j=i;j>=i-k+1;j--) num[j]++;
			}
		}
	}
	k=0;                     //连对 
	for(int i=3;i<=14;i++)
	{
		if(num[i]<=1) k=0;
		else
		{
			k++;
			if(k>=3)
			{
				for(int j=i;j>=i-k+1;j--) num[j]-=2;
				dfs(cnt+1);
				for(int j=i;j>=i-k+1;j--) num[j]+=2;
			}
		}
	}
	k=0;                    //飞机 
	for(int i=3;i<=14;i++)
	{
		if(num[i]<=2) k=0;
		else
		{
			k++;
			if(k>=2)
			{
				for(int j=i;j>=i-k+1;j--) num[j]-=3;
				dfs(cnt+1);
				for(int j=i;j>=i-k+1;j--) num[j]+=3;
			}
		}
	}
	for(int i=2;i<=14;i++)
	{
		if(num[i]<=3)                       //三张 
		{
			if(num[i]<=2) continue; 
			num[i]-=3;
			for(int j=2;j<=15;j++)         //三带一
			{
				if(num[j]<=0 || j==i) continue;
				num[j]--;
				dfs(cnt+1);
				num[j]++;
			}
			for(int j=2;j<=14;j++)        //三带一对 
			{
				if(num[i]<=1 || i==j) continue;
				num[j]-=2;
				dfs(cnt+1);
				num[j]+=2;
			}
			num[i]+=3;
		}
		else                              //四张 
		{
			num[i]-=3;
			for(int j=2;j<=15;j++)        //三带一
			{
				if(num[j]<=0 || j==i) continue;
				num[j]--;
				dfs(cnt+1);
				num[j]++;
			}
			for(int j=2;j<=14;j++)       //三带二 
			{
				if(num[i]<=1 || i==j) continue;
				num[j]-=2;
				dfs(cnt+1);
				num[j]+=2;
			}
			num[i]+=3;
			num[i]-=4;                    //四个 
			for(int j=2;j<=15;j++)
			{
				if(num[j]<=0 || i==j) continue;      //带俩单 
				num[j]--;
				for(int k=2;k<=15;k++)
				{
					if(num[k]<=0 || k==j) continue;
					num[k]--;
					dfs(cnt+1);
					num[k]++;
				}
				num[j]++;
			}
			for(int j=2;j<=14;j++)                //带俩双 
			{
				if(num[j]<=1 || i==j) continue;
				num[j]-=2;
				for(int k=2;k<=14;k++)
				{
					if(num[k]<=1 || k==j) continue;
					num[k]-=2;
					dfs(cnt+1);
					num[k]+=2;
				}
				num[j]+=2;
			}
			num[i]+=4;
		}
	}
	for(int i=2;i<=15;i++)
	{
		if(num[i]) cnt++;
	}
	ans=min(ans,cnt);
}
int main()
{
	scanf("%d%d",&t,&n);
	while(t--)
	{
		ans=1e9+7;
		memset(num,0,sizeof(num));
		for(int i=1;i<=n;i++)
		{
			int ma,color;
			scanf("%d%d",&ma,&color);
			if(ma==0) num[15]++;
			else if(ma==1) num[14]++;
			else num[ma]++;
		}
		dfs(0);
		printf("%d\n",ans);
	}
	return 0;
}
/*
1 13
3 4
7 1
4 3
4 2
3 4
12 4
4 1
6 2
12 4
6 2
6 3
13 3
3 4
*/
2021/10/9 10:31
加载中...