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,表示手 ...
随机推荐
- spring AOP源码分析(三)
在上一篇文章 spring AOP源码分析(二)中,我们已经知道如何生成一个代理对象了,那么当代理对象调用代理方法时,增强行为也就是拦截器是如何发挥作用的呢?接下来我们将介绍JDK动态代理和cglib ...
- linux安装httpd,做文件服务器
在一个团队或者公司层面上,做一个本地的文件服务器,将网上的资源下载到本地,是有必要的.这将节省其他人的很多下载时间. >>提君博客原创 http://www.cnblogs.com/ti ...
- MyBatis映射文件3(参数处理Map)
参数命名 POJO 如果多个参数,正好是业务逻辑的数据模型,那么我们就可以直接传入POJO,这样#{}中就可以直接使用属性名 Map 如果多个参数不是业务逻辑的数据模型,没有对应的POJO,为了方便, ...
- Codeforces 1154C Gourmet Cat
题目链接:http://codeforces.com/problemset/problem/1154/C 题目大意: 主人有一只猫.周一&周四&周日:吃鱼周二&周六:吃兔子周三 ...
- rem 自适应、整体缩放
html{ font-size: calc(100vw/7.5); } 说明: 100vw是设备的宽度,除以7.5可以让1rem的大小在iPhone6下等于100px. 若是低版本的设备不支持rem, ...
- Golang的interface实践
这是第二个我在别的语言里面没有见过的实现,go的interface可以说是独树一帜,让我们仔细来实践一下. interface类型是什么?interface类型定义了一组方法,如果某个对象实现了某个接 ...
- echo "" > 和 echo "" >> 的区别
在写shell脚本中,如果判断一个文件已经存在,但希望重写这个文件,一般用如下方式 echo "" > file.txt 这个表示清空文件的内容,如果使用 echo “” & ...
- LR运行负载测试场景-笔记
控制虚拟用户的行为:通用如图方式 查看用户的运行信息 在控制器释放前释放集合点用户 记录运行时注释---scenario-execution notes Vuser 对话框:初始化.运行.停止运行用户 ...
- vue实例相关2
vue data中 对象/数组 不为空,即使定义为[]/{} new Vue({ el: '#main', data: { list: [], current: {}, aa:'' } }) cons ...
- XCTF 4th-WHCTF-2017 creakme
exe文件 运行一下 随便输一下 ps.这个曹操身边的故事挺有意思的 但是没啥卵用....... 查一下壳无壳 ida载入 发现找不到main函数 直接看start感觉逻辑乱乱的(萌新求不喷..... ...