%%%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. Git之项目使用

    现在最为盛行的版本控制器,非git莫属了, 那就看看在项目中我们是如何使用它的吧 一. 在已经存在秘钥对的情况下,我们需要在本地进行相关配置 git config --global user.name ...

  2. PHP优化与提升

    一.十个不错的建议 1.使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里.这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 ...

  3. freemarker数值格式化

    语法:number?string(exp) 说明:根据给定的格式化表达式将数值格式化为字符串. 参数:格式化字符串,"0"表示固定占位(至少有这个位数,不足位数用0代替),&quo ...

  4. day 7-22 进程,线程,协程

    一.什么是进程 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理 ...

  5. vue 动态插入组件

    HTML代码: <div id="app"> <p>{{ message }}</p> <button @click="add( ...

  6. 将选中项的value值赋给select的title

    $('select').change(function () { $(this).attr("title",$(this).find("option:selected&q ...

  7. uwsgi加nginx部署django restframework前后端分离项目

    一.uwsgi和nginx简介 1.uwsgi(摘抄于百度百科): uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与 ...

  8. python 列表、元组、字典

    一.列表 [ ] 如下的列子都可以成为列表,c=[1,2,3,4,5,6],d=["abc", "张三",“李四”],e=[1,2,3,"abc&qu ...

  9. 记一次阿里云服务器被用作DDOS攻击肉鸡

    事件描述:阿里云报警 ——检测该异常事件意味着您服务器上开启了"Chargen/DNS/NTP/SNMP/SSDP"这些UDP端口服务,黑客通过向该ECS发送伪造源IP和源端口的恶 ...

  10. python数学第一天【极限存在定理】

    1.基本回忆 2.两边夹定理 推论1. 基本三角函数的极限 2.极限存在定理 单调有界数列必有极限 (1)单调递增有上界数列必有极限 (2)单调递减有下界数列必有极限 推论1: (1+1/n)^n有极 ...