BZOJ4325&&洛谷P2668[NOIP2015]斗地主

毒瘤大模拟,披着搜索的皮。。。没错,就是皮。。恶心死了,,,PoPoQQQ大爷说的没错,JB题

//By AcerMo 
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,num[200],ans=0;
int get(int e[])
{
	int gay[50]={0},cnt=0;
	for (int i=0;i<14;i++) gay[e[i]]++;
	while (gay[4]&&gay[2]>1) gay[4]--,gay[2]-=2,cnt++;
	while (gay[4]&&gay[1]>1) gay[4]--,gay[1]-=2,cnt++;
	while (gay[4]&&gay[2]>0) gay[4]--,gay[2]--,cnt++;
	while (gay[3]&&gay[2]>0) gay[3]--,gay[2]--,cnt++;
	while (gay[3]&&gay[1]>0) gay[3]--,gay[1]--,cnt++;
	return cnt+gay[1]+gay[2]+gay[3]+gay[4];//最优情况下组合出牌&&单张牌 
}
void dfs(int e[],int x)
{
	int emm=get(e);
	if (!ans||emm+x<ans) ans=x+emm;
	if (ans&&x>ans) return ;
	int k[200]={0};
	for (int i=0;i<14;i++) k[i]=e[i];
	for (int i=2;i<14;i++)
	{
		int j=i;while (e[j]>2) j++;
		if (j-i>=2)
		{
			for (int o=j;o-i>=2;o--)
			{
				for (int p=i;p<o;p++) k[p]-=3;
				dfs(k,x+1);
				for (int p=i;p<o;p++) k[p]+=3;
			}
		}
	}//三顺的
	for (int i=2;i<14;i++)
	{
		int j=i;while (e[j]>1) j++;
		if (j-i>=3)
		{
			for (int o=j;o-i>=3;o--)
			{
				for (int p=i;p<o;p++) k[p]-=2;
				dfs(k,x+1);
				for (int p=i;p<o;p++) k[p]+=2; 
			}
		}
	}//两顺的
	for (int i=2;i<14;i++)
	{
		int j=i;while (e[j]>0) j++;
		if (j-i>=5)
		{
			for (int o=j;o-i>=5;o--)
			{
				for (int p=i;p<o;p++) k[p]--;
				dfs(k,x+1);
				for (int p=i;p<o;p++) k[p]++; 
			}
		}
	}//单顺
	return ; 
}
signed main()
{
	cin>>n>>m;
	while (n--)
	{
		memset(num,0,sizeof(num));
		for (int i=1;i<=m;i++)
		{
			int a,b;cin>>a>>b;
			if (a==1) a=13;
			else if (a) a--;
			num[a]++;
		}
		ans=0;dfs(num,0);
		cout<<ans<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/81103933