【BZOJ4325】【NOIP2015】斗地主 搜索
题目描述
就是给你一副牌,问你最少几次能出完。
详细规则见规则
\(n\leq 23\)
题解
NOIP的数据非常水,错误一大堆的程序都能AC。
因为顺子对答案的影响最大,所以先枚举顺子进行搜索。
接下来网上很多的程序都直接计算答案了。实际上还要进行一次搜索,枚举拆牌的方案,有以下几种:
1.一组四张牌可以拆成两组两张牌
2.一组四张牌可以拆成一组一张牌+一组三张牌
3.一组三张牌可以拆成一组一张牌+一组两张牌
4.一组两张牌可以拆成两组一张牌
5.一对王可以拆成两组一张牌
然后就可以计算方案。
加个最优性剪枝就可以过了。
时间复杂度:\(O(???)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int s[20];
int a[20],c[20];
int ans,n;
int calc2()
{
int res=0;
memcpy(c,a,sizeof a);
while(c[4]&&c[2]>=2)
{
c[4]--;
c[2]-=2;
res++;
}
while(c[4]&&c[1]>=2)
{
c[4]--;
c[1]-=2;
res++;
}
while(c[3]&&c[2])
{
c[3]--;
c[2]--;
res++;
}
while(c[3]&&c[1])
{
c[3]--;
c[1]--;
res++;
}
return res+c[1]+c[2]+c[3]+c[4];
}
int calc()
{
int ans=calc2();
if(a[4])
{
a[4]--;
a[2]+=2;
ans=min(ans,calc());
a[4]++;
a[2]-=2;
}
if(a[4])
{
a[4]--;
a[3]++;
a[1]++;
ans=min(ans,calc());
a[4]++;
a[3]--;
a[1]--;
}
if(a[3])
{
a[3]--;
a[1]++;
a[2]++;
ans=min(ans,calc());
a[1]--;
a[2]--;
a[3]++;
}
if(a[2])
{
a[2]--;
a[1]+=2;
ans=min(ans,calc());
a[1]-=2;
a[2]++;
}
return ans;
}
int calc3()
{
int i;
memset(a,0,sizeof a);
int res=0;
if(s[0]>=2)
res++;
else if(s[0]==1)
a[1]++;
for(i=1;i<=13;i++)
a[s[i]]++;
res+=calc();
memset(a,0,sizeof a);
for(i=1;i<=13;i++)
a[s[i]]++;
a[1]+=s[0];
return min(res,calc());
}
void dfs(int now)
{
if(now>=ans)
return;
int v=calc3();
ans=min(ans,now+v);
int i,j,k;
for(i=2;i<=13;i++)
{
j=i;
while(j<=13&&s[j]>=3)
{
j++;
if(j-i>=2)
{
for(k=i;k<=j-1;k++)
s[k]-=3;
dfs(now+1);
for(k=i;k<=j-1;k++)
s[k]+=3;
}
}
}
for(i=2;i<=13;i++)
{
j=i;
while(j<=13&&s[j]>=2)
{
j++;
if(j-i>=3)
{
for(k=i;k<=j-1;k++)
s[k]-=2;
dfs(now+1);
for(k=i;k<=j-1;k++)
s[k]+=2;
}
}
}
for(i=2;i<=13;i++)
{
j=i;
while(j<=13&&s[j]>=1)
{
j++;
if(j-i>=5)
{
for(k=i;k<=j-1;k++)
s[k]-=1;
dfs(now+1);
for(k=i;k<=j-1;k++)
s[k]+=1;
}
}
}
for(i=2;i<=13;i++)
if(s[i]==4)
{
s[i]-=4;
for(j=i+1;j<=13;j++)
if(s[j]==4)
{
s[j]-=4;
dfs(now+2);
s[j]+=4;
}
s[i]+=4;
}
}
void solve()
{
int x,y;
memset(s,0,sizeof s);
int i;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(x==1)
x=13;
else if(x)
x--;
s[x]++;
}
ans=0x7fffffff;
dfs(0);
printf("%d\n",ans);
}
int main()
{
int t;
scanf("%d%d",&t,&n);
while(t--)
solve();
return 0;
}
【BZOJ4325】【NOIP2015】斗地主 搜索的更多相关文章
- 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
[BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...
- 2018.11.01 bzoj4325: NOIP2015 斗地主(贪心+搜索)
传送门 原来一直以为是一道大模拟. 没想到是一道搜索+最优性剪枝 如何搜最优呢? 我们考虑怎么最快出完. 大概是应该尽量出当前能出出去最多的吧. 于是我们选择优先出顺子. 这样做有什么好处呢? 我们会 ...
- 【BZOJ4325】NOIP2015 斗地主 搜索+贪心
这个东西考试的时候一眼以为状压就压炸了考试又了一下午.....最后我打出来发现后几个点10min都过不去,我大概算了一下,可能是吧.......最后一脸懵逼的我去怂了正解,我们发现只要确定了顺子就可以 ...
- bzoj4325: NOIP2015 斗地主(爆搜+模拟)
去年的我还不会打斗地主呵呵 觉得这道题挺难的..抄了一遍题解,感触挺多的= = 首先出牌的方式太多了不能每次都枚举所有的出牌方式, 于是分成两部分:1.顺子 2.带牌等其他 每次dfs都搜顺子,而且顺 ...
- NOIP2015 斗地主(搜索+剪枝)
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 270 Solved: 192[Submit][Status] ...
- LOJ2422 NOIP2015 斗地主 【搜索+贪心】*
LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...
- NOIP2015斗地主[DFS 贪心]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- BZOJ 4325: NOIP2015 斗地主
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 684 Solved: 456[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加上大小王的共 ...
随机推荐
- 基于node.js的博客搭建
一个博客应当具备哪些功能? 前台展示 点击下一页,可以点击分类导航. 可以点击进入到具体博文页面 下方允许评论.显示发表时间.允许留言分页. 右侧有登录注册界面. 后台管理 管理员账号:登陆后看到页面 ...
- 我的微信小程序第三篇(app.json)
前言 端午节回家了,所以好多天没有更新,只想说还是待在家里舒服呀,妈妈各种做好吃的,小侄子侄女各种粘着我在室外玩,导致我三天下来不仅胖了一圈,还黑了一圈,上班第一天有同事就说我晒黑了,哭~~~,为了防 ...
- python第一章:简介与安装--小白博客
Python简介 Python是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项 ...
- dfs实现数的全排列
代码 #include<bits/stdc++.h> using namespace std; #define ll long long bool vis[15]; int a[15]; ...
- 1171: lfx捧杯稳啦!
escription Lfx在复习离散的时候突然想到了一个算法题,毕竟是lfx, 算法题如下: 他想知道这样的问题,先定义1~n中即是3的倍数,又是11的倍数的那些数的和sum, 他想知道sum有多少 ...
- T-shirt buying CodeForces - 799B (小根堆+STL)
题目链接 思路: 由于题目说了只有1,2,3,三种色号的衣服,然后开三个对应色号的小根堆, 我是根据pair<int,int> 创建了一个以价格小的优先的优先队列. pair中的另外一个i ...
- Mysql数据库中索引的概念总结
1.索引的目的是什么 1.快速访问数据表中的特定信息,提高检索速度 2.创建唯一性索引,保证数据库表中每一行数据的唯一性. 3.加速表和表之间的连接 4.使用分组和排序子句进行数据检索时,可以显著减少 ...
- JavaScript对象访问器属性
对象访问器就是setter和getter,他们的作用就是 提供另外一种方法来获取或者设置对象的属性值, 并且在获取和设置的时候,可以用一定的其他操作. 看下面代码: <script> va ...
- javascript中的 return false和return true
关于javascript中的 return false和return true,return 是javascript里函数返回值的关键字,一个函数内处理的结果可以使用return 返回,这样在调用函数 ...
- Java Hash集合的equals()与hashCode() 方法
Java 集合实现类,无论是HashSet.HashMap等所有的Hash算法实现的集合类(后面简称Hash集合),加入的对象必须实现 hashCode() 与 equals() 方法,稍微不同的地方 ...