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,表示手 ...
随机推荐
- 5 Expressing future time
1 英语中表达将来的时间有四种主要方式:be going to, will, 现在进行时,一般现在时. 2 Make a prediction. 若要预测将来, 可以使用 be going to 或者 ...
- hadoop 管理命令dfsadmin
hadoop 管理命令dfsadmin dfsadmin 命令用于管理HDFS集群,这些命令常用于管理员. 1. (Safemode)安全模式 动作 命令 把集群切换到安全模式 bin/hdfs df ...
- Spring 的java 配置方式
Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.1@Configuration 和 @Bean Spring的Java配置方式是通过 @Configuration 和 @ ...
- 莫烦keras学习自修第三天【回归问题】
1. 代码实战 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ import numpy as np # 这句话不知道是什么意思 np.random.seed ...
- Armstrong公理
从已知的一些函数依赖,可以推导出另外一些函数依赖,这就需要一系列推理规则,这些规则常被称作“Armstrong 公理”. 设U 是关系模式R 的属性集,F 是R 上成立的只涉及U 中属性的函数依赖集. ...
- 洛谷 p1019 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- C#中decimal,double和float的区别
float 单精度浮点 32bit,double 双精度浮点64bit,decimal是高精度 128bit,浮点型.float double 是 基本类型(primitive type),decim ...
- c++数字和字符串的转换
1 利用stringstream 添加头文件 #include<sstream> 数字转字符串 #include <string> #include <sstrea ...
- 为何CPU散片这么便宜?盒装CPU值得买吗
当玩家选择装一台PC电脑的时候,他会有个怎样的思考过程?第一个要决定的通常是选什么样的处理器,因为处理器的选择可以决定整套平台的预算及性能水平,想玩游戏的话现在4核8线程处理器是入门标准了,高点的则会 ...
- openwrt-scripts/config/mconf: Syntax error: “(” unexpected错误解决
scripts/config/mconf: Syntax error: “(” unexpected错误解决 从其他地方复制而来的openwrt SDK,放在本地执行make menuconfig时出 ...