NOIp 2015 Day1T3斗地主【搜索】
昨天真题测试赛题目==
没想到一道纯到都不用剪枝的搜索会是noipT3难度。
不过因为我搜索弱啊所以打不出来==
LA:这不就是一道简单模拟题么
码完此题能增加对搜索的理解==
(闲话结束)
搜索,我们就是要遍历每一个可能的状态,来寻取最优解。每次我们尝试取到一个状态,然后递归回溯,之后恢复原来的状态。
具体的搜索过程,我们可以贪心地每次先打出耗费牌数更多的手牌,最后对特殊的小王大王情况 和单牌对牌进行处理。
#include<algorithm>
#include<cstdio>
#include<cstring> using namespace std; int T,n,no,x,ans=;
int tong[]; void dfs(int now)
{
int cnt=;
for(int i=;i<=;i++)
{// shunzi single
if(tong[i]) cnt++;
else cnt=;
if(cnt>=)
{
tong[i]--,tong[i-]--,tong[i-]--,tong[i-]--;
int k=i-cnt+;
for(int j=i-;j>=k;j--)
tong[j]--,dfs(now+);
for(int j=k;j<=i;j++)
tong[j]++;
}
}
cnt=;
for(int i=;i<=;i++)
{// shunzi double
if(tong[i]>=) cnt++;
else cnt=;
if(cnt>=)
{
tong[i]-=,tong[i-]-=;
int k=i-cnt+;
for(int j=i-;j>=k;j--)
tong[j]-=,dfs(now+);
for(int j=k;j<=i;j++)
tong[j]+=;
}
}
cnt=;
for(int i=;i<=;i++)
{// shunzi third
if(tong[i]>=) cnt++;
else cnt=;
if(cnt>=)
{
tong[i]-=;
int k=i-cnt+;
for(int j=i-;j>=k;j--)
tong[j]-=,dfs(now+);
for(int j=k;j<=i;j++)
tong[j]+=;
}
}
for(int i=;i<=;i++)
{// four with 2
if(tong[i]>=)
{
tong[i]-=;
for(int j=;j<=;j++)
if(tong[j])
{//2 single
tong[j]--;
for(int k=;k<=;k++)
if(tong[k])
{
tong[k]--;
dfs(now+);
tong[k]++;
}
tong[j]++;
}
for(int j=;j<=;j++)
if(tong[j]>=)
{//2 double
tong[j]-=;
for(int k=;k<=;k++)
if(tong[k]>=)
{
tong[k]-=;
dfs(now+);
tong[k]+=;
}
tong[j]+=;
}
dfs(now+);
//three card
tong[i]+=;
}
}
for(int i=;i<=;i++)
{
if(tong[i]>=)
{
tong[i]-=;
for(int j=;j<=;j++)
if(tong[j])
{//three with 1
tong[j]--;
dfs(now+);
tong[j]++;
}
for(int j=;j<=;j++)
if(tong[j]>=)
{//three with 2
tong[j]-=;
dfs(now+);
tong[j]+=;
}
dfs(now+);// 3 single
tong[i]+=;
}
}
if(tong[]==) now++;
else if(tong[]==) now++;
for(int i=;i<=;i++) if(tong[i]) now+=tong[i]>>;
for(int i=;i<=;i++) if(tong[i]) now+=tong[i]&;
ans=min(ans,now);
} int main()
{
scanf("%d%d",&T,&n);
while(T--)
{
for(int i=;i<=n;i++)
{
scanf("%d%d",&x,&no);
if(x==) x=;
else if(x==) x=;
else if(x==) x=;
tong[x]++;
}
dfs();
printf("%d\n",ans);
ans=;
memset(tong,,sizeof(tong));
}
return ;
}
无注释版
#include<algorithm>
#include<cstdio>
#include<cstring> using namespace std; int T,n,no,x,ans=;
int tong[]; void dfs(int now)
{
int cnt=;
for(int i=;i<=;i++)
{// shunzi single
if(tong[i]) cnt++;
else cnt=;
if(cnt>=)
{
tong[i]--,tong[i-]--,tong[i-]--,tong[i-]--;
int k=i-cnt+;// 顺子牌还要枚举找到起点
for(int j=i-;j>=k;j--)
tong[j]--,dfs(now+);
for(int j=k;j<=i;j++)
tong[j]++;
}
}
cnt=;
for(int i=;i<=;i++)
{// shunzi double
if(tong[i]>=) cnt++;
else cnt=;
if(cnt>=)
{
tong[i]-=,tong[i-]-=;
int k=i-cnt+;
for(int j=i-;j>=k;j--)
tong[j]-=,dfs(now+);
for(int j=k;j<=i;j++)
tong[j]+=;
}
}
cnt=;
for(int i=;i<=;i++)
{// shunzi third
if(tong[i]>=) cnt++;
else cnt=;
if(cnt>=)
{
tong[i]-=;
int k=i-cnt+;
for(int j=i-;j>=k;j--)
tong[j]-=,dfs(now+);
for(int j=k;j<=i;j++)
tong[j]+=;
}
}
for(int i=;i<=;i++)
{// four with 2
if(tong[i]>=)
{
tong[i]-=;
for(int j=;j<=;j++)
if(tong[j])
{//2 single
tong[j]--;
for(int k=;k<=;k++)
if(tong[k])
{
tong[k]--;
dfs(now+);
tong[k]++;
}
tong[j]++;//状态的恢复都是对称的
}
for(int j=;j<=;j++)
if(tong[j]>=)
{//2 double
tong[j]-=;
for(int k=;k<=;k++)
if(tong[k]>=)
{
tong[k]-=;
dfs(now+);
tong[k]+=;
}
tong[j]+=;
}
dfs(now+);
//three card
tong[i]+=;
}
}
for(int i=;i<=;i++)
{
if(tong[i]>=)
{
tong[i]-=;
for(int j=;j<=;j++)
if(tong[j])
{//three with 1
tong[j]--;
dfs(now+);
tong[j]++;
}
for(int j=;j<=;j++)
if(tong[j]>=)
{//three with 2
tong[j]-=;
dfs(now+);
tong[j]+=;
}
dfs(now+);// 3 single
tong[i]+=;
}
}
if(tong[]==) now++;
else if(tong[]==) now++;
for(int i=;i<=;i++) if(tong[i]) now+=tong[i]>>;//出对子牌
for(int i=;i<=;i++) if(tong[i]) now+=tong[i]&;//出单张牌 两者用位运算简化
ans=min(ans,now);//更新答案
} int main()
{
scanf("%d%d",&T,&n);
while(T--)
{
for(int i=;i<=n;i++)
{
scanf("%d%d",&x,&no);
if(x==) x=;
else if(x==) x=;
else if(x==) x=;
tong[x]++;
}
dfs();//现在已经出了0张牌
printf("%d\n",ans);
ans=;
memset(tong,,sizeof(tong));
}
return ;
}
有注释版
NOIp 2015 Day1T3斗地主【搜索】的更多相关文章
- 【UOJ #147】【NOIP 2015】斗地主
http://uoj.ac/problem/147 搜索时先枚举三顺子,双顺子和单顺子,然后贪心带牌和成三成双成单出. #include<cstdio> #include<cstri ...
- 【NOIP 2015】斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 A 到 K 加上大小王的共 54 张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下: 3 ...
- Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)
Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...
- 4632 NOIP[2015] 运输计划
4632 NOIP[2015] 运输计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 公元 2044 ...
- [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告
[NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
- Luogu 1979 NOIP 2013 华容道(搜索,最短路径)
Luogu 1979 NOIP 2013 华容道(搜索,最短路径) Description 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面 ...
- [普及]NOIP 2015 推销员 贪心
NOIP 2015 推销员 题意: 有一个喜欢疲劳的推销员,告诉你在一个单口胡同(数轴)中的n户家庭的位置,和向他们推销可以获得的疲劳度.分别输出向(1,2,3,4...n)户人家推销可以得到的最大疲 ...
- cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分
2109. [NOIP 2015] 运输计划 ★★★☆ 输入文件:transport.in 输出文件:transport.out 简单对比时间限制:3 s 内存限制:256 MB [题 ...
随机推荐
- Android Auto Scroll ViewPager (Smooth)
项目信息 项目地址 https://github.com/benniaobuguai/android-auto-scroll-viewpager 特性 支持自动平滑切换海报.相册等,无限次循环轮播 手 ...
- vim字符串替换命令
呜呜老是忘. 这里记录一下,仅仅记录当中日经常使用的最多的命令. :%s/str1/str2/g 替换每一行中全部str1为str2 经常使用! :s/str1/str2/g 替换当前行全部str ...
- XML语法笔记
XML(可扩展标记语言) XML的特点: XML是一种标记语言,适合跨平台.跨语种信息交互XML被用于存储.传输数据XML可扩展性良好,没有预定义标签,需要用户自定义标签XML具有自我描述性XML采用 ...
- BIOS维修技术
BIOS是电脑中最基础且最重要的程序,为电脑提供最低级且最直接的硬件控制,电脑的原始操作都是依照固化在BIOS里的程序来完成的.因此如果BIOS出现故障将会导致影响电脑的正常工作.BIOS故障有很多, ...
- java使用默认线程池踩过的坑(三)
云智慧(北京)科技有限公司 陈鑫 重新启动线程池 TaskManager public class TaskManager implements Runnable { -.. public TaskM ...
- UIPanGestureRecognizer上下左右滑动方向推断算法
CGFloat const gestureMinimumTranslation = 20.0; typedef enum :NSInteger { kCameraMoveDirectionNone, ...
- file类简单操作
file类可表示文件或文件夹 import java.io.File; import java.io.FilenameFilter; import java.io.IOException; impor ...
- 用redis实现动态时间段内统计排序
问题描述 需要根据某类数据在动态时间段内的统计值对这些数据进行排名.例如按过去24小时内点赞数排名的帖子,每隔一小时计算一次结果.以下描述均针对这个例子展开. 解决思路 针对这种问题,我的第一反应是直 ...
- hadoop配置错误总结
2016-06-02 17:33:04,163 ERROR org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: RECEIVE ...
- Ubuntu 配置 nfsserver
https://help.ubuntu.com/lts/serverguide/network-file-system.html#nfs-installation 网络文件系统 (NFS) NFS 允 ...