• BZOJ 4325[NOIP2015]斗地主


    题面:

    4325: NOIP2015 斗地主

    Time Limit: 30 Sec  Memory Limit: 1024 MB
    Submit: 818  Solved: 559
    [Submit][Status][Discuss]

    Description

     牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由n张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下:

    Input

    第一行包含用空格隔开的2个正整数T,N,表示手牌的组数以及每组手牌的张数。

    接下来T组数据,每组数据N行,每行一个非负整数对Ai,Bi,表示一张牌,其中Ai表示牌的数码,Bi表示牌的花色,中间用空格隔开。特别的,我们用1来表示数码A,11表示数码J,12表示数码Q,13表示数码K;黑桃、红心、梅花、方片分别用1-4来表示;小王的表示方法为01,大王的表示方法为02。

    Output

    共T行,每行一个整数,表示打光第T组手牌的最少次数。

    Sample Input

    1 8
    7 4
    8 4
    9 1
    10 4
    11 1
    5 1
    1 4
    1 1

    Sample Output

    3

    HINT

     共有1组手牌,包含8张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑桃5,方

    片A以及黑桃A。可以通过打单顺子(方片7,方片8,黑桃9,方片10,黑桃J),单张
    牌(黑桃5)以及对子牌(黑桃A以及方片A)在3次内打光。
    T<=10
    N<=23
     
    可以枚举顺子的出牌方法,之后贪心求出最小值。
     1 #include<stdio.h>
     2 #include<string.h>
     3 using namespace std;
     4 #define min(a,b) a<b?a:b
     5 int cnt[30],C[4]={0,4,2,1},ans,b[5];
     6 int caculate()
     7 {
     8     int ret=0;
     9     #define haha(s1,s2,s3,s4) while(b[s1]>=s2&&b[s3]>=s4) b[s1]-=s2,b[s3]-=s4,++ret
    10     memset(b,0,sizeof(b));
    11     for(int i=0;i<=14;i++)
    12         if(i!=1)
    13             ++b[cnt[i]];
    14     haha(4,1,2,2);
    15     haha(4,1,1,2);
    16     haha(3,1,2,1);
    17     haha(3,1,1,1);
    18     return ret+b[1]+b[2]+b[3]+b[4];
    19 }
    20 void dfs(int ss)
    21 {
    22     if(ss>=ans)
    23         return ;
    24     int w,i,k,j,l;
    25     for(w=3;w>=1;w--)
    26         for(i=3;i<=13;i++)
    27         {
    28             for(j=i;j<=14&&cnt[j]>=w;j++);
    29             l=(--j)-i+1;
    30             if(l>C[w])
    31             {
    32                 for(k=i;k<=i+C[w]-1;k++)
    33                     cnt[k]-=w;
    34                 for(k=i+C[w];k<=j;k++)
    35                     cnt[k]-=w,dfs(ss+1);
    36                 for(k=i;k<=j;k++)
    37                     cnt[k]+=w;
    38             }
    39         }
    40     ans=min(ans,ss+caculate());
    41 }
    42 int main()
    43 {
    44     int T,n;
    45     scanf("%d%d",&T,&n);
    46     while(T--)
    47     {
    48         memset(cnt,0,sizeof(cnt));
    49         int x,y;
    50         for(int i=1;i<=n;i++)
    51         {
    52             scanf("%d%d",&x,&y);
    53             if(x==1)
    54                 x=14;
    55             ++cnt[x];
    56         }
    57         ans=min(n,13);
    58         dfs(0);
    59         printf("%d
    ",ans);
    60     }
    61 }
    BZOJ 4325

    (PS:花色一点用都没有)

     
  • 相关阅读:
    [1.2]由UML模型通过XMI生成XML,通过XSLT展示到表现层
    [1.1]XMI 与UML结合开发企业应用中业务模型
    如何创建脱机数据库应用程序思路
    SAML在无线网络传输的应用[对照文]
    SoberGGG对针式PKM的初次测评
    [转]美国知名天使投资人列出愿意投资的30大创意方向
    针式PKM适合哪些用户使用?
    没有个人知识管理就是觉得学了很多,却不得记到底学到了什么。
    [转]人之患在好为人师
    [转]一位中国的黑客的一封信!
  • 原文地址:https://www.cnblogs.com/radioteletscope/p/7259457.html
Copyright © 2020-2023  润新知