[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 年,人类进入了宇宙纪元. ...
随机推荐
- P4332三叉神经树
题面 \(Solution\) 通过模拟,我们会发现每次修改 \(x\),只会改变从 \(x\) 向上一段连续的链的输出. 例如将 \(x\) 点从 \(0\) 改为 \(1,\) 那么它会影响从它向 ...
- 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 ...
- Go基础篇【第8篇】: 内置库模块 bytes [二]
type Reader ¶ type Reader struct { // 内含隐藏或非导出字段 } Reader类型通过从一个[]byte读取数据,实现了io.Reader.io.Seeker.io ...
- 常量表达式 & constexpr
[常量表达式] 一个这样的表达式:值不会改变 && 在编译过程中就能够得到计算结果 常见的常量表达式:字面值.用常量表达式初始化的const对象 一个对象是不是常量表达式由它的数据类型 ...
- 数组中键key相等时,后面的值覆盖前面的值
<?php $arr[]='abc'; $arr[]='; $arr[]='; $arr[]='; var_dump($arr); 结果;
- incorrect integer value for column 问题解决
最近在用zend框架,然后装了一个项目,发现注册的时候出现 General error: 1366 Incorrect integer value: '' for column 'user_id' a ...
- 前端将markdown转换成html
实现过程: 1. npm引入:npm install marked --save 2.在需要的文件(.ts)里import Marked from "marked"; 如果.j ...
- capacilitys 持续集成
目前看好像是说以docker为例来看看这个权限到底是怎么来的? 可以通过在二进制上setcap得到,也可以通过函数自己用setcap得到,两种方法,docker肯定是第二种方法啊,docker中间肯定 ...
- 配置Mac自带的Apache http服务器
Mac系统是自带Apache,所以很方便我们做一些http测试. 我可以先启动默认的服务器 $ sudo apachectl start 在浏览器打开:http://localhost 将会看到下面信 ...
- sql语句编写 有时候一个子查询可以拆分成多个子查询
sql语句编写 有时候一个子查询可以拆分成多个子查询