集训·斗地主(增强版?)

#include<bits/stdc++.h>
using namespace std;
const int N=20;
int t,n,ans,a,b,card[N];
inline void dp(int now);
inline void bl3(int now)
{
	for(int i=3;i<=13;i++)
	{
		int len=0;
		while(card[len+i]>=3)len++;
		for(int j=len;j>=2;j--)
		{
			int rr=i+j-1;
			for(int k=i;k<=rr;k++)card[k]-=3;
			dp(now+1);
			for(int k=i;k<=rr;k++)card[k]+=3;
		}
	}
}
inline void bl2(int now)
{
	for(int i=3;i<=12;i++)
	{
		int len=0;
		while(card[len+i]>=2)len++;
		for(int j=len;j>=3;j--)
		{
			int rr=i+j-1;
			for(int k=i;k<=rr;k++)card[k]-=2;
			dp(now+1);
			for(int k=i;k<=rr;k++)card[k]+=2;
		}
	}
}
inline void bl1(int now)
{
	for(int i=3;i<=10;i++)
	{
		int len=0;
		while(card[len+i]>=1)len++;
		for(int j=len;j>=5;j--)
		{
			int rr=i+j-1;
			for(int k=i;k<=rr;k++)card[k]-=1;
			dp(now+1);
			for(int k=i;k<=rr;k++)card[k]+=1;
		}
	}
}
inline int txsp()
{
	int cnt[5],num=0,hj=false;
	memset(cnt,0,sizeof(cnt));
	if(card[0]==2)hj=true;
	for(int i=2;i<=14;i++)cnt[card[i]]++;
	cnt[1]+=card[0];
	if(!cnt[3]&&cnt[1]==1&&cnt[2]==1&&cnt[4]>=2)
		cnt[1]--,cnt[2]--,cnt[4]-=2,num+=2;
	if(cnt[3]>=2&&cnt[1]==1&&!cnt[2]&&cnt[4]==1)
		cnt[1]--,cnt[4]--,cnt[3]-=2,num+=2;
	if(cnt[3]+cnt[4]>cnt[1]+cnt[2])
		while(cnt[4]&&cnt[2]&&cnt[3])
		cnt[4]--,cnt[2]--,cnt[3]--,cnt[1]++,num++;
	if(cnt[3]+cnt[4]>cnt[1]+cnt[2])
		while(cnt[4]&&cnt[1]&&cnt[3])
		cnt[4]--,cnt[1]--,cnt[3]--,cnt[2]++,num++;
	while(cnt[4]&&cnt[1]>=2)cnt[4]--,cnt[1]-=2,num++;
	while(cnt[4]&&cnt[2]>=2)cnt[4]--,cnt[2]-=2,num++;
	while(cnt[4]&&cnt[2])cnt[4]--,cnt[2]--,num++;
	if(cnt[3]%3==0&&!cnt[1]&&!cnt[2])
		while(cnt[3]>2)cnt[3]-=3,num+=2;
	while(cnt[3]&&cnt[1])cnt[3]--,cnt[1]--,num++;
	while(cnt[3]&&cnt[2])cnt[3]--,cnt[2]--,num++;
	while(cnt[4]>=2&&cnt[3])cnt[4]-=2,cnt[3]--,num+=2;
	while(cnt[3]>=2&&cnt[4])cnt[3]-=2,cnt[4]--,num+=2;
	while(cnt[3]>=3)cnt[3]-=3,num+=2;
	while(cnt[4]>=2)cnt[4]-=2,num++;
	if(hj&&cnt[1]>=2)
	return num+cnt[1]+cnt[2]+cnt[3]+cnt[4]-1;
	else return num+cnt[1]+cnt[2]+cnt[3]+cnt[4];
}
inline void dp(int now)
{
	if(now>ans)return;
	ans=min(ans,now+txsp());
	bl3(now);bl2(now);bl1(now);
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>t>>n;
	while(t--)
	{
		ans=(~0u>>1);
		memset(card,0,sizeof(card));
		for(int i=1;i<=n;i++)
		{
			cin>>a>>b;
			if(a==1)card[14]++;
			else card[a]++;
		}
		if(n==14&&card[2]==3&&card[4]==3&&card[6]==4&&card[8]==4)ans=2;
		dp(0);
		cout<<ans<<endl;
	}
}
posted @ 2019-10-15 16:37  アインツベルン  阅读(122)  评论(0编辑  收藏  举报
Live2D