zoukankan      html  css  js  c++  java
  • 集训·斗地主(增强版?)

    #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;
    	}
    }
    
  • 相关阅读:
    Windows 2008server部署pxe启动安装windows系统
    wordpress迁移报错
    解决PHP无法监听9000端口问题/502错误解决办法
    Failed to start LSB: starts php-fpm
    nginx.service: control process exited, code=exited status=1
    linux通过ntp同步时间
    ESXI6.7主机降级至ESXI6.5
    在vCenter Server中添加ESXi 主机失败的问题
    windows ping bat脚本
    不错的网站压力测试工具webbench
  • 原文地址:https://www.cnblogs.com/Ace-MYX/p/11678612.html
Copyright © 2011-2022 走看看