%%%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斗地主(搜索+模拟+贪心)的更多相关文章

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

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

  2. 【BZOJ4325】NOIP2015 斗地主 搜索+贪心

    这个东西考试的时候一眼以为状压就压炸了考试又了一下午.....最后我打出来发现后几个点10min都过不去,我大概算了一下,可能是吧.......最后一脸懵逼的我去怂了正解,我们发现只要确定了顺子就可以 ...

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

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

  4. NOIP2015斗地主[DFS 贪心]

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

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

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

  6. 2106. [NOIP2015] 斗地主

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

  7. NOIP2015斗地主题解 7.30考试

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

  8. BZOJ 4325: NOIP2015 斗地主

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

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

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

随机推荐

  1. 07-nodejs中npm的使用

    NPM是什么? 简单的说,npm就是JavaScript的包管理工具.类似Java语法中的maven,gradle,python中的pip. 安装 傻瓜式的安装. 第一步:打开https://node ...

  2. centos/ubuntu 双击运行 .sh(shell)文件

    centos 创建桌面双击启动程序(更改图标) - Feythin Lau - 博客园http://www.cnblogs.com/feiyuliu/archive/2012/11/29/279503 ...

  3. Linux 光盘挂载步骤

    mount -t fs_type device dir 挂载操作 常见的文件系统类型 Windows :ntfs.fat32 Linux:ext3.ext4.xfs 光盘: iso9660 挂载光盘: ...

  4. java 获取下一个字母(传大写返回大写,传小写返回小写)

    public static String getNextUpEn(String en){ char lastE = 'a'; char st = en.toCharArray()[0]; if(Cha ...

  5. react单组件 渲染页面

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. [转帖]xargs命令详解,xargs与管道的区别

    xargs命令详解,xargs与管道的区别 https://www.cnblogs.com/wangqiguo/p/6464234.html 之前一直说要学习一下 xargs 到现在为止也没学习.. ...

  7. 想在已创建的Vue工程里引入vux组件

    <1>. 在项目里安装vux npm install vux --save <2>. 安装vux-loader (这个vux文档似乎没介绍,当初没安装结果报了一堆错误) npm ...

  8. cookie路径概念理解

    .创建一个cookie并设置 cookie的有效路径: $.cookie('the_cookie', 'the_value', { expires: 7, path: '/' }); 注:在默认情况下 ...

  9. 转:Flutter Decoration背景设定(边框、圆角、阴影、形状、渐变、背景图像等)

    1 继续关系: BoxDecoration:实现边框.圆角.阴影.形状.渐变.背景图像 ShapeDecoration:实现四个边分别指定颜色和宽度.底部线.矩形边色.圆形边色.体育场(竖向椭圆).  ...

  10. python之路-列表、元组、range

    一 . 列表 # 列表的定义 列表就是能装对象的对象 在python中用[ ]来描述列表,内部元素用逗号隔开,对数据类型没有要求 索引和切片 lst = ["天龙八部", &quo ...