[NOIP 2015] 斗地主 landlord
想起几个月之前的 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的更多相关文章
- Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)
Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...
- 基础算法(搜索):NOIP 2015 斗地主
Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...
- [BZOJ 4325][NOIP 2015] 斗地主
一道防AK好题 4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 820 Solved: 560[Submit] ...
- [NOIp 2015]斗地主
Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...
- noip 2015 斗地主 大爆搜!!!
反正肯定是大模拟 但是每一个可以出的牌都搜一定不是最优的 考虑最特殊的出牌方案:顺子(单,对,三) 每一种方案再加上暴力贪心打出剩下的牌的步数 #include<cstdio> #incl ...
- 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心
题目:https://www.luogu.org/problemnew/show/P2668 https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...
- 4632 NOIP[2015] 运输计划
4632 NOIP[2015] 运输计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 公元 2044 ...
- NOIP 2015
Prob.1 2015 神奇的幻方 模拟就好了.(这不是noip2017的初赛题么.)代码: #include<cstdio> #include<cstring> #inclu ...
- [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告
[NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...
随机推荐
- Docker 安装Neo4j
拉取最新的neo4j镜像 docker pull neo4j 运行Neo4j 容器 docker run -it -d -p 7474:7474 -p 7687:7687 neo4j:latest 打 ...
- 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 ...
- 详细讲解Java中方法的重载和重写
首先讲讲方法的重载: Java的重载就是在类中可以创建多个方法,它们具有相同的名字,但是却有不同的参数. 判断是否重载只有两个条件: 1)相同的方法名 2)不同的参数 具体为: A.方法参数类型不同 ...
- 微信公众号开发java框架:wx4j(MenuUtils篇)
wx4j-MenuUtils使用 函数说明:发送http请求到微信服务器,完成菜单创建 参数:构造菜单对象 返回值:微信响应的json字符串 public static String createMe ...
- DPDK Qos之报文处理流水线
原创翻译,转载请注明出处. 下面是一个支持Qos的复杂报文处理流水线的图: 流水线是通过DPDP可重用的软件库构建出来的.在流水线里实现QoS主要是如下模块:policer,dropper,shced ...
- Java中IO——NIO
一.引入 当引入一些新功能的时候,那说明之前的设计可能还需要完善. 1.阻塞式 在传统的IO输入输出中,如果我们从流中去读数据,而数据源中没有数据时,程序就会阻塞该线程.阻塞式线程的一种基本状态,可以 ...
- Java面试题(上)
2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...
- [剑指Offer] 40.数组中只出现一次的数
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. [思路]此题考察的是异或运算的特点:即两个相同的数异或结果为0. 此题用了两次异或运算特点: ( ...
- sql语句编写 有时候一个子查询可以拆分成多个子查询
sql语句编写 有时候一个子查询可以拆分成多个子查询
- Augmenting Path Algorithm : 一般图最大匹配
算法原理详见 http://www.csie.ntnu.edu.tw/~u91029/Matching.html orz 带花树很神奇,挖坑最大权匹配 #include <iostream> ...