【NOIP2015】斗地主 题解(DFS+贪心)
题目描述
牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的AAA到KKK加上大小王的共545454张牌来进行的扑克牌游戏。在斗地主中,牌的大小关 系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王3<4<5<6<7<8<9<10<J<Q<K<A<2<\text{小王}<\text{大王}3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由 nnn 张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。
现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。
需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下:

本题数据随机,不支持hack,要hack或强力数据请点击这里
-----------------------------------------------------------------------------------------------------------------
搜索经典题目。
没什么别的思路,就是dfs+贪心
总体策略:先打顺子再打三带最后打单牌和对子
坑点巨多,调了好久才调出来……
#include<bits/stdc++.h>
using namespace std;
int T,n,sum[],ans,output[];
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){
if (ch=='-') f=-;
ch=getchar();
}while(''<=ch&&ch<=''){
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
void dfs(int x)
{
if (x>=ans) return;
int k=;
for (int i=;i<=;i++)
{
if (sum[i]==) k=;
else{
k++;
if (k>=){
for (int j=i;j>=i-k+;j--) sum[j]--;
dfs(x+);
for (int j=i;j>=i-k+;j--) sum[j]++;
}
}
}
k=;
for (int i=;i<=;i++)
{
if (sum[i]<=) k=;
else
{
k++;
if (k>=)
{
for (int j=i;j>=i-k+;j--) sum[j]-=;
dfs(x+);
for (int j=i;j>=i-k+;j--) sum[j]+=;
}
}
}
k=;
for (int i=;i<=;i++)
{
if (sum[i]<=) k=;
else
{
k++;
if (k>=)
{
for (int j=i;j>=i-k+;j--) sum[j]-=;
dfs(x+);
for (int j=i;j>=i-k+;j--) sum[j]+=;
}
}
}
for (int i=;i<=;i++)
{
if (sum[i]<=)
{
if (sum[i]<=) continue;
sum[i]-=;
for (int j=;j<=;j++)
{
if (sum[j]<=||j==i) continue;
sum[j]--;
dfs(x+);
sum[j]++;
}
for (int j=;j<=;j++)
{
if (sum[j]<=||j==i) continue;
sum[j]-=;
dfs(x+);
sum[j]+=;
}
sum[i]+=;
}
else
{
sum[i]-=;
for (int j=;j<=;j++)
{
if (sum[j]<=||j==i) continue;
sum[j]--;
dfs(x+);
sum[j]++;
}
for (int j=;j<=;j++)
{
if (sum[j]<=||j==i) continue;
sum[j]-=;
dfs(x+);
sum[j]+=;
}
sum[i]+=;
sum[i]-=;
for (int j=;j<=;j++)
{
if (sum[j]<=||j==i) continue;
sum[j]--;
for (int h=;h<=;h++)
{
if (sum[h]<=||j==h) continue;
sum[h]--;
dfs(x+);
sum[h]++;
}
sum[j]++;
}
for (int j=;j<=;j++)
{
if (sum[j]<=||j==i) continue;
sum[j]-=;
for (int h=;h<=;h++)
{
if (sum[h]<=||h==j) continue;
sum[h]-=;
dfs(x+);
sum[h]+=;
}
sum[j]+=;
}
sum[i]+=;
}
}
for (int i=;i<=;i++) if (sum[i]) x++;
ans=min(ans,x);
}
int main()
{
T=read(),n=read();int ff=T;
while(T--)
{
ans=0x7fffffff;
int x,y;
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++)
{
x=read(),y=read();
if (x==) sum[]++;
else if(x==) sum[]++;
else sum[x]++;
}
dfs();
cout<<ans<<endl;
}
}
【NOIP2015】斗地主 题解(DFS+贪心)的更多相关文章
- LOJ2422 NOIP2015 斗地主 【搜索+贪心】*
LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...
- NOIP2015斗地主题解 7.30考试
问题 B: NOIP2015 斗地主 时间限制: 3 Sec 内存限制: 1024 MB 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共 ...
- ICPC Asia Nanning 2017 I. Rake It In (DFS+贪心 或 对抗搜索+Alpha-Beta剪枝)
题目链接:Rake It In 比赛链接:ICPC Asia Nanning 2017 Description The designers have come up with a new simple ...
- NOIP2015斗地主[DFS 贪心]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
[BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...
- NOIP2015 斗地主(搜索+剪枝)
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 270 Solved: 192[Submit][Status] ...
- [补档][NOIP2015] 斗地主
[NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...
- 【bzoj4813】[Cqoi2017]小Q的棋盘 树上dfs+贪心
题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V个格点,编号为0,1,2…,V-1,它们是连通的 ...
- 2106. [NOIP2015] 斗地主
2106. [NOIP2015] 斗地主 ★★★☆ 输入文件:landlords.in 输出文件:landlords.out 简单对比 时间限制:2 s 内存限制:1025 M ...
随机推荐
- WPF 精准大小的消息气泡生成
在其他网站发布过,都是这里写的. 全部为Wpf方式,生成的气泡宽度高度较为精确. 适用任意字体以及字号,可设置图像字体.字号.行间距.字间距.阴影.气泡宽度等,在RichtextboxHelper.c ...
- day14总结
装饰器 """1.什么是装饰器 器指的是工具/功能 装饰指的是为被装饰对象添加额外的功能 大白话:定义装饰器就是定义了一个函数,该函数就是用来为其他函数添加额外的功能的 ...
- element-ui 表单校验 Rules 配置 常用黑科技
type 指示type要使用的验证器.可识别的类型值为: string:类型必须为string.type 默认是 string // 校验 string: [ {type: 'string', mes ...
- nuxt的使用中碰到的问题
使用npm run generate生成静态页面部署 如果不是部署在域名的根目录下,则需要在nuxt.config.js中添加 // nuxt.config.js export default { r ...
- php基础学习中认为重点的知识
<?php ... ?> 简写成 <? ... ?> 服务器中可以通过php.ini中配置short_open_tag为on来实现 php语句必须以分号 ; 结尾 . 连接 ...
- www.215wd.com
www.215wd.com 传奇销售系统 QQ:1479528000
- python数据处理(七)之数据探索和分析
1.探索数据 1.1 安装agate库 1.2 导入数据 1.3 探索表函数 a.排序 b.最值,均值 c.清除缺失值 d.过滤 e.百分比 1.4 连结多个数据集 a.捕捉异常 b.去重 c.缺失数 ...
- java 基本语法(一) 关键字与标识符
1.java关键字的使用定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所字母都为小写具体哪些关键字: 2.保留字:现Java版本尚未使用,但以后版本可能会作为关键字使用 ...
- 没内鬼,来点干货!volatile和synchronized
题外话 这篇笔记是我<没内鬼>系列第二篇,其实我计划是把设计模式和多线程并发分为两个系列,统一叫<一起学系列>来系统的介绍 相关的知识,但是想到这篇笔记去年就写成了,一直不发心 ...
- 第四章:View的工作原理
4.1 ViewRoot和DecorView ViewRoot对应于ViewRootImplement类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过Vie ...