想起几个月之前的 noip2015…只会瞎搞…这道题骗了 30 分。T T

题目

牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的 A 到 K 加上大小王的共 54 张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2< 小王 < 大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由 n 张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。

  现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。

  需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。

  具体规则如下:


其实看起来不好做,一顿乱搞就行了…

好吧承认还是瞄了一眼题解。大概是:先枚举所有的顺子的情况,然后对剩下的单张、对子、三张、四张贪心一下…

放代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; const int L[] = {0, 4, 2, 1}, INF = 0x3f3f3f3f;
int card[20]; //牌的张数,王 = 0,2 = 2, 3 = 3, ... K = 13, A = 14
int cnt[5]; //统计单张、对子、三张、四张的个数。
int ans; //不考虑各种顺子的手数
int calc(){
memset(cnt, 0, sizeof(cnt));
for(int i = 2; i <= 14; ++i){
++cnt[card[i]];
}
cnt[1] += card[0];
int ret = cnt[3] + cnt[4], tmp; tmp = min(cnt[4], cnt[2] >> 1);
cnt[4] -= tmp; cnt[2] -= tmp << 1;
tmp = min(cnt[4], cnt[1] >> 1);
cnt[4] -= tmp; cnt[1] -= tmp << 1; if(cnt[2] || cnt[1]){
tmp = min(cnt[3], cnt[2]);
cnt[3] -= tmp; cnt[2] -= tmp;
tmp = min(cnt[3], cnt[1]);
cnt[3] -= tmp; cnt[1] -= tmp;
} ret += cnt[1] + cnt[2];
if(cnt[1] >= 2 && card[0] == 2) --ret;
return ret;
} //hnd:已经使用的手数
//w:顺子的宽度(1 <= w <= 3)
void dfs(int hnd, int w, int depth){
if(w < 1) return;
/*
for(int i = 0; i < depth; ++i) printf("--");
printf("hands = %d, w = %d\n", hnd, w);
for(int i = 0; i <= 14; ++i) printf("%d ", card[i]);
printf("\n");
*/
ans = min(ans, calc() + hnd);
dfs(hnd, w - 1, depth + 1); int head = -1; //顺子头
for(int i = 3; i <= 14; ++i){
if(card[i] >= w){
if(head == -1) head = i;
else if(i >= head + L[w]){
for(int j = head; j <= i; card[j++] -= w);
for(int j = head; j <= i; card[j++] += w){
if(i >= j + L[w]) dfs(hnd + 1, w, depth + 1);
}
}
} else {
head = -1;
}
}
} int main(){
// freopen("in.txt", "r", stdin); int T, N, a, b;
scanf("%d%d", &T, &N);
while(T--){
memset(card, 0, sizeof(card));
ans = INF;
for(int i = 0; i < N; ++i){
scanf("%d%d", &a, &b);
if(a == 1) a = 14;
++card[a];
} dfs(0, 3, 0);
printf("%d\n", ans);
}
return 0;
}

[NOIP 2015] 斗地主 landlord的更多相关文章

  1. Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)

    Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...

  2. 基础算法(搜索):NOIP 2015 斗地主

    Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...

  3. [BZOJ 4325][NOIP 2015] 斗地主

    一道防AK好题 4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 820  Solved: 560[Submit] ...

  4. [NOIp 2015]斗地主

    Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...

  5. noip 2015 斗地主 大爆搜!!!

    反正肯定是大模拟 但是每一个可以出的牌都搜一定不是最优的 考虑最特殊的出牌方案:顺子(单,对,三) 每一种方案再加上暴力贪心打出剩下的牌的步数 #include<cstdio> #incl ...

  6. 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心

    题目:https://www.luogu.org/problemnew/show/P2668   https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...

  7. 4632 NOIP[2015] 运输计划

    4632 NOIP[2015] 运输计划  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题解       题目描述 Description 公元 2044 ...

  8. NOIP 2015

    Prob.1 2015 神奇的幻方 模拟就好了.(这不是noip2017的初赛题么.)代码: #include<cstdio> #include<cstring> #inclu ...

  9. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

随机推荐

  1. P4332三叉神经树

    题面 \(Solution\) 通过模拟,我们会发现每次修改 \(x\),只会改变从 \(x\) 向上一段连续的链的输出. 例如将 \(x\) 点从 \(0\) 改为 \(1,\) 那么它会影响从它向 ...

  2. git instaweb 500 error

    在arch 系统中安装perl-cgi包. 在deiban中参考:https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A ...

  3. Go基础篇【第8篇】: 内置库模块 bytes [二]

    type Reader ¶ type Reader struct { // 内含隐藏或非导出字段 } Reader类型通过从一个[]byte读取数据,实现了io.Reader.io.Seeker.io ...

  4. 常量表达式 & constexpr

    [常量表达式] 一个这样的表达式:值不会改变 && 在编译过程中就能够得到计算结果 常见的常量表达式:字面值.用常量表达式初始化的const对象 一个对象是不是常量表达式由它的数据类型 ...

  5. 数组中键key相等时,后面的值覆盖前面的值

    <?php $arr[]='abc'; $arr[]='; $arr[]='; $arr[]='; var_dump($arr); 结果;

  6. incorrect integer value for column 问题解决

    最近在用zend框架,然后装了一个项目,发现注册的时候出现 General error: 1366 Incorrect integer value: '' for column 'user_id' a ...

  7. 前端将markdown转换成html

    实现过程: 1. npm引入:npm install marked --save 2.在需要的文件(.ts)里import Marked from "marked";   如果.j ...

  8. capacilitys 持续集成

    目前看好像是说以docker为例来看看这个权限到底是怎么来的? 可以通过在二进制上setcap得到,也可以通过函数自己用setcap得到,两种方法,docker肯定是第二种方法啊,docker中间肯定 ...

  9. 配置Mac自带的Apache http服务器

    Mac系统是自带Apache,所以很方便我们做一些http测试. 我可以先启动默认的服务器 $ sudo apachectl start 在浏览器打开:http://localhost 将会看到下面信 ...

  10. sql语句编写 有时候一个子查询可以拆分成多个子查询

    sql语句编写 有时候一个子查询可以拆分成多个子查询