[BZOJ 4325][NOIP 2015] 斗地主
一道防AK好题
4325: NOIP2015 斗地主
Time Limit: 30 Sec Memory Limit: 1024 MB
Submit: 820 Solved: 560
[Submit][Status][Discuss]Description
牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由n张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下:
Input
第一行包含用空格隔开的2个正整数T,N,表示手牌的组数以及每组手牌的张数。
接下来T组数据,每组数据N行,每行一个非负整数对Ai,Bi,表示一张牌,其中Ai表示牌的数码,Bi表示牌的花色,中间用空格隔开。特别的,我们用1来表示数码A,11表示数码J,12表示数码Q,13表示数码K;黑桃、红心、梅花、方片分别用1-4来表示;小王的表示方法为01,大王的表示方法为02。Output
共T行,每行一个整数,表示打光第T组手牌的最少次数。
Sample Input
1 8
7 4
8 4
9 1
10 4
11 1
5 1
1 4
1 1Sample Output
3HINT
共有1组手牌,包含8张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑桃5,方
片A以及黑桃A。可以通过打单顺子(方片7,方片8,黑桃9,方片10,黑桃J),单张牌(黑桃5)以及对子牌(黑桃A以及方片A)在3次内打光。T<=10N<=23
港真估计只有真正的$dalao$才能在考场上思路明确地码完这题qwq
虽然实际写出来代码量倒也不算大,比某维修数列好到不知哪里去了
这种大模拟的马力出题人应该被挂起来裱(雾)
正解就是个大暴搜,$DFS$查找顺牌的同时扫描查找带牌...
查找带牌时遵循尽量出最多的牌的贪心策略即可w
需要注意的是王牌可以出现在带牌里(四个 2 带俩王2333333)但是王牌和2都不能出现在顺子里
其他的完全乱搞就行只要能保证正确性w
参考做法
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> int n;
int ans;
int sum[];
int cnt[]; int MakePair();
void DFS(int);
void Initialize();
int Convert(int); int main(){
int t;
scanf("%d%d",&t,&n);
while(t--){
Initialize();
ans=MakePair();
DFS();
printf("%d\n",ans);
}
} void Initialize(){
int x,trash;
memset(sum,,sizeof(sum));
for(int i=;i<n;i++){
scanf("%d%d",&x,&trash);
sum[Convert(x)]++;
}
} int MakePair(){
memset(cnt,,sizeof(cnt));
int ans=;
for(int i=;i<=;i++)
cnt[sum[i]]++;
while(cnt[]>=&&cnt[]>=){
cnt[]--;
cnt[]-=;
ans++;
}
while(cnt[]>=&&cnt[]>=){
cnt[]--;
cnt[]-=;
ans++;
}
while(cnt[]>=&&cnt[]>=){
cnt[]--;
cnt[]--;
ans++;
}
while(cnt[]>=&&cnt[]>=){
cnt[]--;
cnt[]--;
ans++;
}
ans+=cnt[]+cnt[]+cnt[]+cnt[];
return ans;
} void DFS(int deep){
if(deep>ans)
return;
ans=std::min(ans,deep+MakePair());
for(int i=;i<=;i++){
int tmp=i;
while(tmp<=&&sum[tmp]>=)
tmp++;
tmp--;
if(tmp-i+<)
continue;
for(int k=tmp;k-i+>=;k--){
for(int j=i;j<=k;j++)
sum[j]-=;
DFS(deep+);
for(int j=i;j<=k;j++)
sum[j]+=;
}
}
for(int i=;i<=;i++){
int tmp=i;
while(tmp<=&&sum[tmp]>=)
tmp++;
tmp--;
if(tmp-i+<)
continue;
for(int k=tmp;k-i+>=;k--){
for(int j=i;j<=k;j++)
sum[j]-=;
DFS(deep+);
for(int j=i;j<=k;j++)
sum[j]+=;
}
}
for(int i=;i<=;i++){
int tmp=i;
while(tmp<=&&sum[tmp]>=)
tmp++;
tmp--;
if(tmp-i+<)
continue;
for(int k=tmp;k-i+>=;k--){
for(int j=i;j<=k;j++)
sum[j]--;
DFS(deep+);
for(int j=i;j<=k;j++)
sum[j]++;
}
}
} inline int Convert(int x){
if(x==)
return ;
else if(x==)
return ;
else if(x==)
return ;
else
return x-;
}
Backup

[BZOJ 4325][NOIP 2015] 斗地主的更多相关文章
- Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)
Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...
- 基础算法(搜索):NOIP 2015 斗地主
Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...
- [NOIp 2015]斗地主
Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...
- [NOIP 2015] 斗地主 landlord
想起几个月之前的 noip2015-只会瞎搞-这道题骗了 30 分.T T 题目 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 A 到 K 加上大小王的共 54 张牌 ...
- 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 年,人类进入了宇宙纪元. ...
随机推荐
- MyBatis介绍
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的 XML或注解用于配 ...
- 格式化输出和printf命令
GNU版本的printf命令用来格式化输出,效果类似与C语言的printf函数.2.x以上版本的Bash内建的printf命令和e/usr/bin下的printf命令使用方法一样. 例子:$print ...
- react-native-fs插件的使用以及遇到的坑
react-native-fs插件是文件对上传和下载时使用的,iOS和android都可使用,File upload (iOS only). 安装命令: npm install react-nativ ...
- OS X 和iOS 中的多线程技术(下)
OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...
- 【转载】Sublime Text 3065 Keygen and Patcher
原始日期:2014-10-01 18:25 差不多时隔一年了,Sublime Text 终于更新啦!相信很多友友都已经升级到3065版本了,所以我也特地抽空为大家做了个新版补丁.该补丁仅作为 ...
- mongodb入门笔记
mongodb作为nosql中排名第一的数据库,近年来使用的人数越来越多,作为开发人员,非常有必要了解下mongodb数据库.下面就给大家介绍下mongodb数据库的基本知识,有不对的地方欢迎指正,Q ...
- 枚举:enum——初写
入门的时候,针对某一字段状态的判断,一开始是在前端用if else 判断,有一些弊端:①把内置的code暴露给用户②if else最好不要超过3层③前端很长一段冗余判断不规范后改进使用枚举,在后台进行 ...
- 如何卸载CentOS自带的apache
查看安装的组件: rpm -qa | grep httpd 如果预装有apache,那么会显示像httpd-2.2.3-22.el5.centos这种的组件名. 卸载组件: rpm -e httpd- ...
- 2.如何使用matlab拟合曲线
输入数据 做数据曲线拟合,当然该有数据,本经验从以如下数据作为案例. 添加数据到curve fitting程序 这一步就是将你要拟合的数据添加到curve fitting程序中,同时给你拟合的曲线 ...
- I/O多路复用之epoll实战
概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程 通俗理解(摘自网上一大神) 这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前 ...