90pts WA on#11,#20,求条(悬赏1关注)
查看原帖
90pts WA on#11,#20,求条(悬赏1关注)
1234324
god_std楼主2025/7/28 13:16
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,n;
int King,king;
int num[20];
int ans;
void init()
{
	for(int i=0;i<20;i++)
		num[i]=0;
	ans=INT_MAX;
	King=king=0;
	return ;
}
bool no()
{
	for(int i=2;i<=14;i++)
		if(num[i]>0)
			return false;
	if(king>0||King>0)
		return false;
	return true;
}
void dfs(int round)
{
	
	int ro=round;
	if(round>ans)
		return;
	if(no())
	{
		ans=min(round,ans);
	}
	if(King==1&&king==1)
	{
		King=0,king=0;
		dfs(round+1);
		King=1,king=1;
	}
	int k=0;
	for(int i=3;i<=14;i++)
	{
		if(num[i]>0)
			k++;
		else
			k=0;
		if(k>=5)
		{
			int begin=i-k+1;
			int begie=i-5+1;
			for(int be=begin;be<=begie;be++)
			{
				for(int j=be;j<=i;j++)
					num[j]--;
				dfs(round+1);
				for(int j=be;j<=i;j++)
					num[j]++;			
			}
		}
	}
	k=0;
	for(int i=3;i<=14;i++)
	{
		if(num[i]>1)
			k++;
		else
			k=0;
		if(k>=3)
		{
			int begin=i-k+1;
			int begie=i-3+1;
			for(int be=begin;be<=begie;be++)
			{
				for(int j=be;j<=i;j++)
					num[j]-=2;
				dfs(round+1);
				for(int j=be;j<=i;j++)
					num[j]+=2;			
			}
		}
	}
	k=0;
	for(int i=3;i<=14;i++)
	{
		if(num[i]>2)
			k++;
		else
			k=0;
		if(k>=2)
		{
			int begin=i-k+1;
			int begie=i-2+1;
			for(int be=begin;be<=begie;be++)
			{
				for(int j=be;j<=i;j++)
					num[j]-=3;
				dfs(round+1);
				for(int j=be;j<=i;j++)
					num[j]+=3;			
			}
		}
	}
	for(int i=2;i<=14;i++)
	{
		if(num[i]>=3)
		{
			num[i]-=3;
			dfs(round+1);
			num[i]+=3;
			for(int j=2;j<=14;j++)
			{
				if(num[j]>=1&&i!=j)
				{
					num[j]-=1;num[i]-=3;
					dfs(round+1);
					num[j]+=1;num[i]+=3;
				}
				if(num[j]>=2&&i!=j)
				{
					num[j]-=2;num[i]-=3;
					dfs(round+1);
					num[j]+=2;num[i]+=3;
				}
			}
			if(King==1)
			{
				num[i]-=3;
				King--;
				dfs(round+1);
				King++;
				num[i]+=3;
			}
			if(king==1)
			{
				num[i]-=3;
				king--;
				dfs(round+1);
				king++;
				num[i]+=3;
			}
		}
		if(num[i]==4)
		{
			num[i]=0;
			dfs(round+1);
			num[i]=4;
			for(int j=2;j<=14;j++)
			{
				for(k=2;k<=14;k++)
				{
					if(num[j]>=1&&num[k]>=1&&i!=j&&j!=k&&i!=k)
					{
						num[i]-=4;num[j]-=1;num[k]-=1;
						dfs(round+1);
						num[i]+=4;num[j]+=1;num[k]+=1;
					}
					if(num[j]>=2&&num[k]>=2&&i!=j&&j!=k&&i!=k)
					{
						num[i]-=4;num[j]-=2;num[k]-=2;
						dfs(round+1);
						num[i]+=4;num[j]+=2;num[k]+=2;
					}
				}
			}
			if(King==1)
			{
				for(int j=2;j<=14;j++)
				{
					if(num[j]>0&&i!=j)
					{
						num[i]-=4;
						num[j]-=1;
						King-=1;
						dfs(round+1);
						num[i]+=4;
						num[j]+=1;
						King+=1;
					}
				}
			}
			if(king==1)
			{
				for(int j=2;j<=14;j++)
				{
					if(num[j]>0&&i!=j)
					{
						num[i]-=4;
						num[j]-=1;
						king-=1;
						dfs(round+1);
						num[j]-=4;
						num[j]+=1;
						king+=1;
					}
				}
			}
		}
	}
	if(King==1||king==1)
		ro++;
	for(int i=2;i<=14;i++)
	{
		if(num[i]!=0)
			ro++;
	}
	ans=min(ro,ans);
	return ;
}
int solve()
{
	init();
	for(int i=1;i<=n;i++)
	{
		int a,b;
		cin>>a>>b;
		if(a==0)
			if(b==1)
				King=1;
			else
				king=1;
		else if(a==1)
			num[14]++;
		else
			num[a]++;
	}
	dfs(0);
	return ans;
}
signed main()
{
	cin>>T>>n;
	while(T--)
		cout<<solve()<<endl;
	return 0;
}
2025/7/28 13:16
加载中...