• 斗地主


    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;
    }
  • 相关阅读:
    Log4j.properties配置详解
    在Listener(监听器)定时启动的TimerTask(定时任务)中使用Spring@Service注解的bean
    Java定时任务:利用java Timer类实现定时执行任务的功能
    java关于Timer schedule执行定时任务 !!!!!!!!!
    java关于Timer schedule执行定时任务
    Cannot call sendRedirect() after the response has been committed错误;
    http status 301/302 & java重定向/转发
    jQuery判断checkbox是否选中的3种方法
    怎样从Mysql官网下载mysql.tar.gz版本的安装包
    (转)Nagios 配置及监控
  • 原文地址:https://www.cnblogs.com/19992147orz/p/6059557.html
Copyright © 2020-2023  润新知