NOIP2015斗地主(搜索+模拟+贪心)
%%%Luan
题面就不说了,和斗地主一样,给一组牌,求最少打几次。
注意一点,数据随机,这样我们瞎搞一搞就可以过,虽然直接贪心可以证明是错的。
枚举方法,每次搜索按照(三顺子>二顺子>普通顺子)枚举一个进入下一层搜索。
在每层搜索中我们都要枚举打其他牌的方法,用贪心的结果+顺子数来更新答案。
具体方法是(想象你手里有这么多牌你该怎么打),枚举四代二,四代一,三代二,三代一,对和单。
注意我要带的必须是恰好两个或一个,不然会被随机数据hack。。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int di[],cnt[],ans,n,t,a,b;
inline int counting(){
int jians=;
for(int i=;i<=;++i)di[i]=cnt[i];
for(int i=;i<=;++i)
if(di[i]>=)
for(int j=;j<=;++j)
if(i!=j&&di[j]==&&di[i]>=)
for(int k=j+;k<=;++k)
if(k!=i&&di[k]==){di[i]-=;di[j]-=;di[k]-=;jians++;break;}
for(int i=;i<=;++i)
if(di[i]>=)
for(int j=;j<=;++j)
if(i!=j&&di[j]==&&di[i]>=)
for(int k=j+;k<=;++k)
if(k!=i&&di[k]==){di[i]-=;di[j]--;di[k]--;jians++;break;}
for(int i=;i<=;++i)
if(di[i]>=)
for(int j=;j<=;++j)
if(i!=j&&di[j]==){di[j]-=;di[i]-=;jians++;break;}
for(int i=;i<=;++i)while(di[i]>=)jians++,di[i]-=;
for(int i=;i<=;++i)
if(di[i]>=)
for(int j=;j<=;++j)
if(i!=j&&di[j]==){if(di[i]<)break;di[i]-=;di[j]-=;jians++;}
for(int i=;i<=;++i)
if(di[i]>=)
for(int j=;j<=;++j)
if(i!=j&&di[j]==){if(di[i]<)break;di[j]--;di[i]-=;jians++;}
for(int i=;i<=;++i)while(di[i]>=)jians++,di[i]-=;
for(int i=;i<=;++i)while(di[i]>=)jians++,di[i]-=;
for(int i=;i<=;++i)while(di[i])jians++,di[i]--;
return jians;
}
void dfs(int deep){
if(deep>=ans)return;
for(int i=;i<=;++i){
if(cnt[i])break;
if(i==){
ans=deep;return;
}
}
// for(int i=1;i<=14;++i)cout<<cnt[i]<<" ";cout<<" ";
int cmd=counting();//cout<<cmd<<endl;
if(cmd+deep<ans)ans=cmd+deep;
for(int i=;i<=;++i)if(cnt[i]>=)
for(int j=i+;j<=;++j){
bool tag=;
for(int k=i;k<=j;++k)
if(cnt[k]<){
tag=;
break;
}
if(tag)break;
for(int k=i;k<=j;++k)cnt[k]-=;
dfs(deep+);
for(int k=i;k<=j;++k)cnt[k]+=;
}
for(int i=;i<=;++i)if(cnt[i]>=)
for(int j=i+;j<=;++j){
bool tag=;
for(int k=i;k<=j;++k)
if(cnt[k]<){
tag=;
break;
}
if(tag)break;
for(int k=i;k<=j;++k)cnt[k]-=;
dfs(deep+);
for(int k=i;k<=j;++k)cnt[k]+=;
}
for(int i=;i<=;++i)
for(int j=i+;j<=;++j){
bool tag=;
for(int k=i;k<=j;++k)
if(!cnt[k]){
tag=;
break;
}
if(tag)break;
for(int k=i;k<=j;++k)--cnt[k];
dfs(deep+);
for(int k=i;k<=j;++k)++cnt[k];
}
}
int main(){
scanf("%d%d",&t,&n);
while(t--){
memset(cnt,,sizeof(cnt));
for(int i=;i<=n;++i){
scanf("%d%d",&a,&b);
if(a>=||a<=)cnt[a-]++;
if(a==)cnt[]++;
if(a==)cnt[]++;
if(a==)cnt[]++;
}
ans=0x3f3f3f3f;
dfs();
printf("%d\n",ans);
}
return ;
}
NOIP2015斗地主(搜索+模拟+贪心)的更多相关文章
- 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
[BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...
- 【BZOJ4325】NOIP2015 斗地主 搜索+贪心
这个东西考试的时候一眼以为状压就压炸了考试又了一下午.....最后我打出来发现后几个点10min都过不去,我大概算了一下,可能是吧.......最后一脸懵逼的我去怂了正解,我们发现只要确定了顺子就可以 ...
- LOJ2422 NOIP2015 斗地主 【搜索+贪心】*
LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...
- NOIP2015斗地主[DFS 贪心]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- NOIP2015 斗地主(搜索+剪枝)
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 270 Solved: 192[Submit][Status] ...
- 2106. [NOIP2015] 斗地主
2106. [NOIP2015] 斗地主 ★★★☆ 输入文件:landlords.in 输出文件:landlords.out 简单对比 时间限制:2 s 内存限制:1025 M ...
- NOIP2015斗地主题解 7.30考试
问题 B: NOIP2015 斗地主 时间限制: 3 Sec 内存限制: 1024 MB 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共 ...
- BZOJ 4325: NOIP2015 斗地主
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 684 Solved: 456[Submit][Status] ...
- [补档][NOIP2015] 斗地主
[NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...
随机推荐
- JQuery动态修改样式
JQuery动态修改样式 SetStyle(); function SetStyle() { $(".toolbar").remove(); $(".placeholde ...
- Java Map 集合实现类
Map 用于保存具有映射关系的数据,集合里会保存两组值,一组用于保存Map里的key,一组用于保存Map里的value,key与map可以是任何引用类型数据.Map的key不允许重复.key与valu ...
- 2 JAVA 项目名称前红色叹号如何解决
1 Java 项目前出现红色叹号Eclipse找不到项目需要的JAR包,可以在这里面解决: ① 右键点击项目,选择[Build Path].[Configure Build Path...] ② 在这 ...
- PropertyChangeSupport 监听器模式的应用
PropertyChangeSupport 类实现的监听器功能 ,它是java jdk自带的一个类,用于监听某个对象属性的改变来触发相应信息,具体看代码介绍 import java.beans.Pro ...
- jQuery操作复选框checkbox技巧总结 ---- 设置选中、取消选中、获取被选中的值、判断是否选中等
转载:https://blog.csdn.net/chenchunlin526/article/details/77448168 jQuery操作复选框checkbox技巧总结 --- 设置选中.取消 ...
- C++多态(静多态和动多态)
如今的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式(object-oriented ...
- python爬虫之Splash使用初体验
Splash是什么: Splash是一个Javascript渲染服务.它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT.Twisted(Q ...
- python爬虫scrapy之如何同时执行多个scrapy爬行任务
背景: 刚开始学习scrapy爬虫框架的时候,就在想如果我在服务器上执行一个爬虫任务的话,还说的过去.但是我不能每个爬虫任务就新建一个项目吧.例如我建立了一个知乎的爬行任务,但是我在这个爬行任务中,写 ...
- 实体类注解错误:Could not determine type for: java.util.List
今天配置实体类注解时,出现以下错误: Caused by: org.hibernate.MappingException: Could not determine type for: java.uti ...
- Clover file list
/Volumes/EFI//EFI: total 4 drwxrwxrwx 1 jianweiliu staff 512 Apr 20 12:17 APPLE drwxrwxrwx@ 1 jianwe ...