斗地主

98分 无能为力了

是个搜索,先开始没动脑筋,直接每种情况都搜,样例都要跑5秒钟,然后看了看题解,看到了一句话:后面可以贪心。

好像是的,那么就贪心吧(因为剩下的东西无非就是几带几,带的越多越好,当然可以贪心了)

然后一直五十几分,下了个数据,发现要逐位枚举顺子,(7 8 9 10 j q)

可以有 7 8 9 10 j ,8 9 10 j q,都要枚举,然后就98分。

原来还能4带4 4可以拆成两个2.。。。。。。。

先开始搜索,就是把所有的顺子搜完,没有先后顺序

次数不会大于15,因为一共只有15种牌

#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
using namespace std;
int ans=20; 
int num[30];
inline int max(int x,int y)
{
    return x>y?x:y;
}
inline int min(int x,int y)
{
    return x<y?x:y;
}
void dfs(int d)
{            
    for(int i=3;i<=10;i++)//单顺子 
    {
        if(num[i]>=1) 
        {
            int pos=0;
            for(int j=i+1;j<=14;j++) 
                if(num[j]>=1) 
                {
                    if(j-i>=4)
                    {
                        for(int k=i;k<=j;k++) num[k]--;
                        dfs(d+1);
                        for(int k=i;k<=j;k++) num[k]++;
                    }
                } else break;
        }
    }    
    for(int i=3;i<=12;i++)//双顺子 
    {
        if(num[i]>=2) 
        {
            int pos=0;
            for(int j=i+1;j<=14;j++) 
                if(num[j]>=2) 
                {
                    if(j-i>=2)
                    {
                        for(int k=i;k<=j;k++) num[k]-=2;
                        dfs(d+1);
                        for(int k=i;k<=j;k++) num[k]+=2;
                    }
                } else break;
        }
    }    
    for(int i=3;i<=13;i++)//三顺子 
    {
        if(num[i]>=3) 
        {
            int pos=0;
            for(int j=i+1;j<=14;j++) 
                if(num[j]>=3) 
                {
                    if(j-i>=1)
                    {
                        for(int k=i;k<=j;k++) num[k]-=3;
                        dfs(d+1);
                        for(int k=i;k<=j;k++) num[k]+=3; 
                    }
                } else break;
            }
    } 
    int temp=d;
    int all[8]; memset(all,0,sizeof(all));
    for(int i=2;i<=14;i++) all[num[i]]++;
    if(num[15]==1) all[5]=1;
    if(num[16]==1) all[6]=1;
    for(int i=1;i<=all[4];i++)
    {
        if(all[2]>=2) 
            all[2]-=2;
        else if(all[1]>=2) all[1]-=2;
        else if(all[2]==1) all[2]--;
        else if(all[5]>=1&&all[6]>=1) 
        {
            all[5]--; all[6]--;
        } 
        else if(i<all[4]) all[4]--;
        temp++;
    }
    for(int i=1;i<=all[3];i++)
    {
        if(all[2]>=1) all[2]--;
        else 
        {
            if(all[1]>=1) all[1]--;
            else
            {
                if(all[5]>=1) all[5]--;
                else if(all[6]>=1) all[6]--;
            }
        }
        temp++;
    }
    temp+=(all[2]+all[1]+max(all[5],all[6]));
    ans=min(ans,temp);
}
int main()
{
//    freopen("output1.txt","w",stdout);
    int T,n; scanf("%d%d",&T,&n);
    while(T--)
    {
//        cout<<T<<"--------"<<endl;
        ans=20;
        memset(num,0,sizeof(num));
        for(int i=1;i<=n;i++)
        {
            int a,b; scanf("%d%d",&a,&b);
            if(a!=0&&a!=1) num[a]++;
            if(a==1) num[14]++;
            if(a==0) 
            {
                if(b==1) num[15]++;
                if(b==2) num[16]++;
            }
        }
/*        for(int i=2;i<=16;i++)
        {
            if(i==11)
            {
                cout<<"J:"<<num[i]<<endl;
                continue;
            }
            if(i==12)
            {
                cout<<"Q:"<<num[i]<<endl;
                continue;
            }
            if(i==13)
            {
                cout<<"K:"<<num[i]<<endl;
                continue;
            }
            if(i==14)
            {
                cout<<"A:"<<num[i]<<endl;
                continue;
            }
            if(i==15)
            {
                cout<<"W1:"<<num[i]<<endl;
                continue;
            }
            if(i==16)
            {
                cout<<"W2:"<<num[i]<<endl;
                continue;
            }
            cout<<i<<":"<<num[i]<<endl;
        }*/
        dfs(0);
        cout<<ans<<endl;
    }
//    fclose(stdout);
    return 0;
}

 

posted @ 2016-11-13 19:19  19992147  阅读(132)  评论(0编辑  收藏  举报