全WA,求调
查看原帖
全WA,求调
1338267
HongWenCha楼主2024/10/4 17:27
#include<bits/stdc++.h>  
using namespace std;  
int ans=1e9,t,n,card[20],ago[10010];  
int rd()  
{  
    int x=0,sig=1;  
    char c;  
        for(c=getchar();c<'0'||c>'9';c=getchar())  
	    if (c=='-') sig=-1;  
    for(;c>='0'&&c<='9';c=getchar())  
	    x=x*10+c-48;  
    return x*sig;  
}  
void ccin()  
{  
	for(int i=1;i<=20;i++)  
	  card[i]=0;  
	memset(ago,0,sizeof(ago));  
	int fw;  
	for(int i=1;i<=n;i++)  
	{  
		int x;  
		x=rd();fw=rd();  
		if(x==1)card[14]++;  
		else  
		if(x==0)card[15]++;  
		else card[x]++;  
	}  
}  
inline void dfs(int dep,int now)  
{  
	if(dep>=ans)return;  
	if(dep>ago[now])return;  
	ago[now]=dep;  
	int p=0;  
	for(int i=3;i<=14;i++)  
	{  
		if(card[i]==0)p=0;  
		else  
		{  
			p++;  
			if(p>=5)  
			{  
				for(int j=i-p+1;j<=i;j++)  
				  card[j]--;  
				dfs(1+dep,now-p);  
				for(int j=i-p+1;j<=i;j++)  
				  card[j]++;  
			}  
		}  
	}  
	p=0;  
	for(int i=3;i<=14;i++)  
	{  
		if(card[i]<2)p=0;  
		else  
		{  
			p++;  
			if(p>=3)  
			{  
				for(int j=i-p+1;j<=i;j++)  
				  card[i]-=2;  
				dfs(dep+1,now-p);  
				for(int j=i-p+1;j<=i;j++)  
				  card[i]+=2;  
			}  
		}  
	}  
	p=0;  
	for(int i=3;i<=14;i++)  
	{  
		if(card[i]<3)p=0;  
		else   
		{  
			p++;   
			if(p>=2)  
			{  
				for(int j=i-p+1;j<=i;j++)  
				  card[j]-=3;  
				dfs(dep+1,now-p);  
				for(int j=i-p+1;j<=i;j++)  
				  card[i]+=3;  
			}  
		 }   
	}  
	for(int i=2;i<=14;i++)  
	{  
		if(card[i]>=3)  
		{   
			card[i]-=3;  
			for(int j=2;j<=15;j++)  
			{  
				if(card[j]>0&&j!=i)  
				{  
					card[j]--;  
					dfs(dep+1,now-4);  
					card[j]++;  
				}  
			}  
			for(int k=2;k<=15;k++)  
			{  
				if(card[k]>1&&k!=i)  
			    {  
			    	card[k]-=2;  
			    	dfs(dep+1,now-6);  
			    	card[k]+=2;  
			    }  
			}  
			if(card[i]>=4)  
			{  
				card[i]--;  
				for(int j=2;j<=15;j++)  
				{  
					if(card[j]>0&&j!=i)  
					{  
						card[j]--;  
						for(int   k=2;k<=15;k++)  
						{  
						  	if(card[k]>0&&k!=j)  
							{  
								card[k]--;
								dfs(dep+1,now-6);  
								card[k]++;  
							}  
						}  
						card[j]++;  
					}  
				}  
				for(int j=2;j<=15;j++)  
				{  
					if(card[j]>1&&j!=i)  
					{  
						card[j]-=2;  
						for(int   k=2;k<=15;k++)  
						{  
						   	if(card[k]>1&&k!=j)  
							{  
								card[k]-=2;  
								dfs(dep+1,now-8);  
								card[k]+=2;  
							}  
						}  
						card[j]+=2;  
					}  
				}  
				card[i]++;  
			}  
			card[i]+=3;  
		}	  
	}  
	for(int i=2;i<=15;i++)  
	  if(card[i]>0)dep++;  
	ans=min(dep,ans);  
	return;  
}  
int main()  
{  
	t=rd();  
	while(t--)  
	{  
		n=rd();  
		ccin();  
		dfs(0,n);  
		cout<<ans<<endl;  
		ans=1e9;   
	}   
	return 0;   
}
2024/10/4 17:27
加载中...