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


    #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;
    	}
    }
    
  • 相关阅读:
    优化-IO
    优化-cpu
    优化-内存
    系统优化
    snort -- 入侵检测系统
    tripwire--入侵检测系统
    sudo
    selinux
    pptpd
    C++ 内联函数
  • 原文地址:https://www.cnblogs.com/Ace-MYX/p/11678612.html
Copyright © 2020-2023  润新知