[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 年,人类进入了宇宙纪元. ...
随机推荐
- ubuntu中 VI 方向键、删除键问题
这两天重新装的ubuntu系统,发觉使用VI时,方向键按下去后变成ABCD,删除键无效.网上搜寻一番,应该是VI软件本身的问题,顾卸载重装即可,步骤如下: 1.执行命令 sudo apt-get re ...
- 软工实践 - 第二十五次作业 Beta 冲刺(3/7)
队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10116979.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...
- 201621123033 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...
- java有几种对象(PO,VO,DAO,BO,POJO)
首先,java有几种对象(PO,VO,DAO,BO,POJO) 一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.使用Hibernate来生成PO是 ...
- SSH Secure Shell Client的使用方法
1:双击其客户端图标,出现下图所示窗体 2:我使用她主要用于发布项目的,所以第一次使用会选择新建一个账户 3:填写账户的名称 4:完善账户的信息 5:主要用填下远程主机的IP/USER/PORT,在需 ...
- 11大精选Android自学网站
无论是从事什么开发,只要是软件行业,不断的更新迭代自己掌握的知识是少不了的.相信干过程序猿的童鞋都清楚,如果要在技术上有所提升,工作之余的不断学习是少不了的.今天小编为大家分享的就是一些比较有用的学习 ...
- BZOJ4597 SHOI2016随机序列(线段树)
先考虑题目所说的太简单了的问题.注意到只要把加减号相取反,就可以得到一对除了第一项都互相抵消的式子.于是得到答案即为Σf(i)g(i),其中f(i)为前缀积,g(i)为第i个数前面所有符号均填乘号,第 ...
- 周记【距gdoi:117天】
国庆被“吞”了 图论还剩下平面图.分层图.欧拉图…… 是现实太残酷还是自己兴趣不够? 努力吧.
- GROUP_CONCAT(expr)
This function returns a string result with the concatenated non-NULL values from a group. It returns ...
- 获取html元素内容
html: <!DOCTYPE ><html> <head> <meta http-equiv="Content-Type" conten ...