想起几个月之前的 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. Docker 安装Neo4j

    拉取最新的neo4j镜像 docker pull neo4j 运行Neo4j 容器 docker run -it -d -p 7474:7474 -p 7687:7687 neo4j:latest 打 ...

  2. HDU 4722 Good Numbers(位数DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)

    Description If we sum up every digit of a number and the result can be exactly divided by 10, we say ...

  3. 详细讲解Java中方法的重载和重写

    首先讲讲方法的重载: Java的重载就是在类中可以创建多个方法,它们具有相同的名字,但是却有不同的参数. 判断是否重载只有两个条件: 1)相同的方法名 2)不同的参数 具体为: A.方法参数类型不同 ...

  4. 微信公众号开发java框架:wx4j(MenuUtils篇)

    wx4j-MenuUtils使用 函数说明:发送http请求到微信服务器,完成菜单创建 参数:构造菜单对象 返回值:微信响应的json字符串 public static String createMe ...

  5. DPDK Qos之报文处理流水线

    原创翻译,转载请注明出处. 下面是一个支持Qos的复杂报文处理流水线的图: 流水线是通过DPDP可重用的软件库构建出来的.在流水线里实现QoS主要是如下模块:policer,dropper,shced ...

  6. Java中IO——NIO

    一.引入 当引入一些新功能的时候,那说明之前的设计可能还需要完善. 1.阻塞式 在传统的IO输入输出中,如果我们从流中去读数据,而数据源中没有数据时,程序就会阻塞该线程.阻塞式线程的一种基本状态,可以 ...

  7. Java面试题(上)

    2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...

  8. [剑指Offer] 40.数组中只出现一次的数

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. [思路]此题考察的是异或运算的特点:即两个相同的数异或结果为0. 此题用了两次异或运算特点: ( ...

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

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

  10. Augmenting Path Algorithm : 一般图最大匹配

    算法原理详见 http://www.csie.ntnu.edu.tw/~u91029/Matching.html orz 带花树很神奇,挖坑最大权匹配 #include <iostream> ...