【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 ...
随机推荐
- Python并发编程——多线程与协程
Pythpn并发编程--多线程与协程 目录 Pythpn并发编程--多线程与协程 1. 进程与线程 1.1 概念上 1.2 多进程与多线程--同时执行多个任务 2. 并发和并行 3. Python多线 ...
- CTF_show平台 web题解 part1
web3 题目描述: 方法一:RFI 使用url实现php远程文件包含 在服务器上构造1.txt <?php $a = "<?php eval(\$_POST['123'])?& ...
- window10下启动vue项目具体步骤
1. 安装nodejs 直接去nodejs官方网站下载安装包(https://nodejs.org/zh-cn/) 然后在cmd窗口里面输入 node -v 可以检测出来nodejs是否在全局环境下安 ...
- C#中String与byte[]的相互转换
从文件中读取字符串 string filePath = @"C:\Temp.xml"; string xmlString= File.ReadAllText(filePath); ...
- Python基础最难知识点:正则表达式(使用步骤)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 正则表达式,简称regex,是文本模式的描述方法.你可以在google上搜 ...
- Spring用到了那些注解?
一:@Autowired(按类型注入)1.1通过 @Autowired的使用来消除 set ,get方法.@Autowiredprivate Dao dao;这样就可以删除set ,get方法和spr ...
- Ethical Hacking - Web Penetration Testing(6)
REMOTE FILE INCLUSION Similar to local file inclusion. But allows an attacker to read ANY file from ...
- 数据结构 | 30行代码,手把手带你实现Trie树
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法和数据结构专题的第28篇文章,我们一起来聊聊一个经典的字符串处理数据结构--Trie. 在之前的4篇文章当中我们介绍了关于博弈论的 ...
- 2020JAVA最新应对各种OOM代码样例及解决办法
引言 作者:黄青石 链接:https://www.cnblogs.com/huangqingshi/p/13336648.html?utm_source=tuicool&utm_medium= ...
- DJANGO-天天生鲜项目从0到1-002-用户模块-注册
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...