【暴力剪枝】NOIP2015-斗地主[NOIP填坑]

【题目大意】

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

【思路】

搜索+剪枝。统计每种数字出现的次数,先算顺子。

注意双王算作对子。

 1 #include<iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int MAXN= 18;
 7
 8 int calc(int x[])
 9 {
10     memset(cnt, 0, sizeof(cnt));
11     int res=0;
12     for(int i=0;i<maxn;i++) cnt[x[i]]++;
13     while(cnt[4]&& cnt[2]>= 2) res++,cnt[4]--,cnt[2]-=2;
14     while(cnt[4]&& cnt[1]>= 2) res++,cnt[4]--,cnt[1]-=2;
15     while(cnt[3]&& cnt[2]>= 1) res++,cnt[3]--,cnt[2]-=1;
16     while(cnt[3]&& cnt[1]>= 1) res++,cnt[3]--,cnt[1]-=1;
17     return res+cnt[1]+cnt[2]+cnt[3]+cnt[4];
18 }
19
20 void dfs(intx[],intstep)
21 {
22     if(step>ans)return;
23     ans=min(ans,step+calc(x));
24     for(int i=2,j;i<maxn;i++)
25     {
26         for(j=i;x[j]>=3;j++);
27         if(j-i>=2)
28         {
29             for(int t=j;t-i>=2;t--)
30             {
31                 for(intk=i;k<t;k++)x[k]-=3;
32                 dfs(x,step+1);
33                 for(intk=i;k<t;k++)x[k]+=3;
34             }
35         }
36     }
37     for(int i=2,j;i<maxn;i++)
38     {
39         for(j=i;x[j]>=2;j++);
40         if(j-i>=3){
41             for(int t=j;t-i>=3;t--)
42             {
43                 for(intk=i;k<t;k++)x[k]-=2;
44                 dfs(x,step+1);
45                 for(intk=i;k<t;k++)x[k]+=2;
46             }
47         }
48     }
49     for(int i=2,j;i<maxn;i++)
50     {
51         for(j=i;x[j]>=1;j++);
52         if(j-i>=5){
53             for(int t=j;t-i>=5;t--){
54                 for(intk=i;k<t;k++)x[k]-=1;
55                 dfs(x,step+1);
56                 for(intk=i;k<t;k++)x[k]+=1;
57             }
58         }
59     }
60 }
61
62 int main()
63 {
64     scanf("%d%d",&T,&n);
65     while(T--)
66     {
67         memset(a,0,sizeof(a));
68         for(int i=1;i<=n;i++)
69         {
70             intw=iread(),c=iread();
71             if(w==1)w=13;
72             elseif(w)w--;
73             a[w]++;
74         }
75         ans=calc(a);
76         dfs(a,0);
77         printf("%d\n",ans);
78     }
79     return0;
80 }
时间: 2024-10-18 21:04:51

【暴力剪枝】NOIP2015-斗地主[NOIP填坑]的相关文章

树链剖分-Hello!链剖-[NOIP2015]运输计划-[填坑]

This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://www.cnblogs.com/JasonCow/ [NOIP2015]运输计划    Hello!链剖.你好吗? 题意: 给出一棵n个节点的带权树,m对树上点对 现在允许删除一条边,(权值修改为0) 输出: 最小化的点对间最大距离 1.链剖 2.树上差分 3.二分 链剖我就不多说了,就是两dfs 注意

小程序项目之再填坑

简诉 是的,真的,你没有看错,我就是上次那个加薪的,但是现在问题来了,最近又搞了个小程序的需求,又填了不少坑,其中的辛酸就不说了,说多了都是泪,此处省略三千字 ---^--,说重点吧,反正最后就是差点这让老板叫走人了,你说优秀不优秀-. 前段时间网上一直说的"<你可以骂那些中年人,尤其是有车有房的-->",虽然我没有房.也没有车,但也坚决不做那个可以随便骂的中年人(人到中年不如狗??),不存在的啦,这个仇宝宝已经记下了,先分享一下最近遇到的几个坑吧. -- 我是首席填坑官-

一名Android开发者的微信小程序填坑之路(2)

前言 上一篇是九月二十七日写的,而这一篇我动笔的时间是十月十日(特殊的日子),中间相隔十三天--当然是因为国庆节.说老实话,这十三天里面我都没有碰和小程序有关的东西--毕竟学习小程序的开发也只是起于兴趣,而平时的工作并不会涉及与其相关的东西--但是在这十三天里,我能明显的感受到小程序热正在逐渐的消退,或者说大家正在逐渐以一种较为平和的姿态接受它的存在,其实这是一件好事.期待公测的到来. 接下来我就直接进入正题了,另外,文末我想和大家分享一下我的国庆节. PS:这篇文章是接着上一篇文章 一名And

【结果很简单,过程很艰辛】记阿里云Ons消息队列服务填坑过程

Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的时候,会开放思路.当然不得不说,Ons的.NET接口还很不完善,甚至没有独立在Windos 2008/2012服务器测试过,希望官方加把力. 1.阿里云ONS介绍 ONS(Open Notification Service)即开放消息服务,是基于阿里开源消息中间件MetaQ(RocketMQ)打造的

LCT 填坑系列

清华冬令营 T1用了LCT 这个东西以前有写过 然而并不熟练 发现没了板子根本就不会写 只能填一填坑辣 BZOJ 2843 LCT 1 #include <bits/stdc++.h> 2 #define N 30010 3 #define ls c[x][0] 4 #define rs c[x][1] 5 using namespace std; 6 7 inline int read() 8 { 9 int x=0,f=1; char ch=getchar(); 10 while(ch&l

[临时向]蒟蒻的填坑记录

TAT这周开始填坑....这周大概是数据结构吧?来这里记录一下免得自己过几天又开始颓了TAT 1.3:中午看了下zkw线段树,写了bzoj3685...找前驱后缀的姿势不是很科学...不过速度相差不大就懒得改了. 晚上写treap..分别用zkw线段树和treap写了bzoj3224普通平衡树.....正常的treap大概300+ms...zkw线段树190+ms 1.4:中午用treap写了1503郁闷的出纳员....晚上写1058报表统计..弄了一晚上TAT 目测明天重开spaly...

移动端web开发填坑指南之——百分比的过错

在移动端开发中,特别是在安卓的微信端进行开发的时候会遇到各种奇奇怪怪的坑.慢慢写慢慢填坑. 今天遇到的是,移动端中对一个div指定了height:100%;之后在安卓微信浏览器端遇到当input调起软键盘之后整个页面布局被重新resize后压扁,而ios则不会遇到这个问题. 通过实验,发现用通过js获取当前可是窗口高度后再对该div进行赋值之后,此时在安卓调起软键盘就不会出现这样的问题. 可见时对高度进行百分比设置的错.因为100%导致整个页面在软键盘弹出后进行了重新的resize操作. 做一个

css 填坑常用代码分享

以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. /*强制不换行*/ white-space:nowrap; /*自动换行*/ word-wrap: break-word; word-break: normal; /*强制英文单词断行*/ word-break:break-all; 2. 两端对齐 text-align:justify;text-justify:inter-ideogra 3. 去掉Webkit(chrome)浏览器中input(文本框)或texta

ubuntu 14.04中安装 ruby on rails 环境(填坑版) 呕血推荐

环境:在win7 上Vmware虚拟机环境中安装的ubuntu 14.04 开发相关: ruby 2.2.0 rails 4.2.0 sublime text 3 本文说明:所有的命令均在$ 之后,若$前边带有信息,只是为了方便你理解和与自己对照. 安装过程中由于这样那样的原因,产生许多坑,所谓坑是对初学者来说,大牛们飘过吧. 步骤1.从官网下载ubuntu 14.04 X64 http://124.205.69.136/files/2013000000502943/202.141.176.11