题目描述

牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的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+贪心)的更多相关文章

  1. LOJ2422 NOIP2015 斗地主 【搜索+贪心】*

    LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...

  2. NOIP2015斗地主题解 7.30考试

    问题 B: NOIP2015 斗地主 时间限制: 3 Sec  内存限制: 1024 MB 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共 ...

  3. 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 ...

  4. NOIP2015斗地主[DFS 贪心]

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  5. 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝

    [BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...

  6. NOIP2015 斗地主(搜索+剪枝)

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 270  Solved: 192[Submit][Status] ...

  7. [补档][NOIP2015] 斗地主

    [NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...

  8. 【bzoj4813】[Cqoi2017]小Q的棋盘 树上dfs+贪心

    题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V个格点,编号为0,1,2…,V-1,它们是连通的 ...

  9. 2106. [NOIP2015] 斗地主

        2106. [NOIP2015] 斗地主 ★★★☆   输入文件:landlords.in   输出文件:landlords.out   简单对比 时间限制:2 s   内存限制:1025 M ...

随机推荐

  1. 【python接口自动化】01-requests请求

    requests是模拟HTTP.https请求接口. 一.HTTP协议介绍 1.1HTTP协议特点 1.2HTTP协议组成 请求方法 主要的请求方法有:GET.POST.DELETE .PUT .HE ...

  2. 关于Pop!_OS 19.04有线网络始终正在连接

    一开始使用Pop!_OS时就遇到这个问题,开机进入系统后明明网络没问题,WiFi正常可用, 但是插入网线后有线网络始终显示正在连接,然后可能过一会儿还会弹出来网络激活失败. 但是有可能在使用很久之后再 ...

  3. Quartz.Net系列(十一):System.Timers.Timer+WindowsService实现定时任务

    1.创建WindowsService项目 2.配置项目 3.AddInstaller(添加安装程序) 4.修改ServiceName(服务名称).StartType(启动类型).Description ...

  4. java 面向对象(九):类的结构:构造器(一)简介;属性赋值顺序;JavaBean的概念

    1.构造器(或构造方法):Constructor构造器的作用: * 1.创建对象 * 2.初始化对象的信息2.使用说明: * 1.如果没显式的定义类的构造器的话,则系统默认提供一个空参的构造器 * 2 ...

  5. 数据可视化之powerBI技巧(二十)采悟:创建度量值,轻松进行分组统计

    上一篇文章中的分组,都是通过新建列的方式实现的,直观上比较容易理解.不过这样都修改了原始数据的结构,如果我们不在源表上进行修改,直接通过度量值的方式来进行分组,是否可以实现呢? 答案当然是肯定的. 采 ...

  6. spring boot实现简单的登录拦截

    一.思路 1.在pom.xml导入相关包 2.先写个简单的认证适配器(WebSecurityConfig extends WebSecurityConfigurerAdapter),登录拦截后就会跳转 ...

  7. 【软件安装】CentOS7安装MariaDb(mysql_替代品安装)

    1.背景 Maria Db是流行的跨平台MySQL数据库管理系统的分支,被认为是MySQL 的完全替代品.Maria Db是由Sun在Sun Micro systems合并期间被Oracle收购后,于 ...

  8. Web优化躬行记(1)——CSS

    Web优化的对象包括页面性能.用户体验.开发效率.代码优化.网络延迟等,本系列会列举出众多常用的优化技巧,每个技巧都可深入分析,在此只做抛砖引玉. 本系列优化内容提炼于<前端面试宝典>.& ...

  9. 如何在CSDN博客开头处加上版权声明?

    1.首先在CSDN账号头像处打开"管理博客"选项. 2.然后在管理博客界面左侧找到设置下面的"博客设置"选项. 3.将博客设置里的"版权声明" ...

  10. IDEA中配置Project Structure

    本文主要介绍在IDEA中怎么配置项目Project Structure. 若文中有所偏错,望能够留言指正,不胜感激. 不再赘述,直接进入正题: 1. 打开IDEA的Project Structure( ...