洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心
题目:https://www.luogu.org/problemnew/show/P2668
https://www.luogu.org/problemnew/show/P2540
首先,如果没有顺子,那么有贪心最优解;
所以先搜索顺子,再贪心求剩余的出牌方案;
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n,a[],t[],ans,inf=0x3f3f3f3f;
int calc()
{
int ret=;
memset(t,,sizeof t);
for(int i=;i<=;i++)t[a[i]]++;
while(t[]&&t[]>=)t[]--,t[]-=,ret++;
while(t[]&&t[]>=)t[]--,t[]-=,ret++;
while(t[]&&t[])t[]--,t[]--,ret++;
while(t[]&&t[])t[]--,t[]--,ret++;
while(t[]&&t[])t[]--,t[]--,ret++;
return ret+t[]+t[]+t[]+t[];
}
void dfs(int u)//顺子
{
if(u>ans)return;
int tmp=calc();
if(u+tmp<ans)ans=u+tmp;
for(int i=,j;i<=;i++)
{
for(j=i;j<=;j++)if(a[j]<)break;
j--;
if(j-i+<)continue;
for(int k=j;k>=i+;k--)
{
for(int l=i;l<=k;l++)a[l]-=;
dfs(u+);
for(int l=i;l<=k;l++)a[l]+=;
}
}
for(int i=,j;i<=;i++)
{
for(j=i;j<=;j++)if(a[j]<)break;
j--;
if(j-i+<)continue;
for(int k=j;k>=i+;k--)
{
for(int l=i;l<=k;l++)a[l]-=;
dfs(u+);
for(int l=i;l<=k;l++)a[l]+=;
}
}
for(int i=,j;i<=;i++)
{
for(j=i;j<=;j++)if(!a[j])break;
j--;
if(j-i+<)continue;
for(int k=j;k>=i+;k--)
{
for(int l=i;l<=k;l++)a[l]--;
dfs(u+);
for(int l=i;l<=k;l++)a[l]++;
}
}
}
int main()
{
scanf("%d%d",&T,&n);
while(T--)
{
memset(a,,sizeof a);
for(int i=,x,y;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(x==)x=;
else if(x)x--;
a[x]++;
}
ans=inf; dfs();
printf("%d\n",ans);
}
return ;
}
增强版要考虑拆牌,看了题解,感觉好混乱...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n,a[],t[],ans,inf=0x3f3f3f3f;
int calc()
{
int ret=;bool wz=;
memset(t,,sizeof t);
if(a[]==)wz=; t[]+=a[];
for(int i=;i<=;i++)t[a[i]]++;
while(!t[]&&t[]>&&t[]==&&t[]==)t[]-=,t[]--,t[]--,ret+=;//4=3+1,出四带二单和三带二
while(!t[]&&t[]>&&t[]==&&t[]==)t[]-=,t[]--,t[]--,ret+=;//3=2+1,出四带二单和三带二
if(t[]+t[]>t[]+t[])
while(t[]&&t[]&&t[])t[]--,t[]--,t[]--,t[]++,ret++;//3=2+1,出四带二对,余一单
if(t[]+t[]>t[]+t[])
while(t[]&&t[]&&t[])t[]--,t[]--,t[]--,t[]++,ret++;//3=2+1,出四带二单,余一对
while(t[]&&t[]>)t[]--,t[]-=,ret++;
while(t[]&&t[]>)t[]--,t[]-=,ret++;
while(t[]&&t[])t[]--,t[]--,ret++;
if(t[]%==&&t[]+t[]<=)
while(t[]>)t[]-=,ret+=;//3=2+1,出三带二,三带一
while(t[]&&t[])t[]--,t[]--,ret++;
while(t[]&&t[])t[]--,t[]--,ret++;
//还剩3和4
while(t[]>&&t[])t[]-=,t[]--,ret+=;//4=2+2,出四带二和三带二
while(t[]>&&t[])t[]-=,t[]--,ret+=;//4=2+2,出2*三带二
while(t[]>)t[]-=,ret+=;//3=2+1,出三带二和三带一
while(t[]>)t[]-=,ret++;//4=2+2,出四带二对
if(wz&&t[]>=)return ret+t[]+t[]+t[]+t[]-;
else return ret+t[]+t[]+t[]+t[];
}
void dfs(int u)//顺子
{
if(u>ans)return;
int tmp=calc();
if(u+tmp<ans)ans=u+tmp;
for(int i=,j;i<=;i++)
{
for(j=i;j<=;j++)if(a[j]<)break;
j--;
if(j-i+<)continue;
for(int k=j;k>=i+;k--)
{
for(int l=i;l<=k;l++)a[l]-=;
dfs(u+);
for(int l=i;l<=k;l++)a[l]+=;
}
}
for(int i=,j;i<=;i++)
{
for(j=i;j<=;j++)if(a[j]<)break;
j--;
if(j-i+<)continue;
for(int k=j;k>=i+;k--)
{
for(int l=i;l<=k;l++)a[l]-=;
dfs(u+);
for(int l=i;l<=k;l++)a[l]+=;
}
}
for(int i=,j;i<=;i++)
{
for(j=i;j<=;j++)if(!a[j])break;
j--;
if(j-i+<)continue;
for(int k=j;k>=i+;k--)
{
for(int l=i;l<=k;l++)a[l]--;
dfs(u+);
for(int l=i;l<=k;l++)a[l]++;
}
}
}
int main()
{
scanf("%d%d",&T,&n);
while(T--)
{
memset(a,,sizeof a);
for(int i=,x,y;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(x==)x=;
else if(x)x--;
a[x]++;
}
ans=inf; dfs();
printf("%d\n",ans);
}
return ;
}
洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心的更多相关文章
- Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)
Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...
- 洛谷P1378 油滴扩展(搜索)
洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #in ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...
- 随手练——洛谷-P1151(枚举与暴力搜索)
枚举 #include <iostream> using namespace std; int main() { ; cin >> k; ; i < ; i++) { ) ...
- 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)
科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...
- 随手练——洛谷-P1008 / P1618 三连击(暴力搜索)
1.普通版 第一眼看到这个题,我脑海里就是,“我们是不是在哪里见过~”,去年大一刚学C语言的时候写过一个类似的题目,写了九重循环....就像这样(在洛谷题解里看到一位兄台写的....超长警告,慎重点开 ...
- 洛谷 P1013 进制位 【搜索 + 进制运算】
题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E KL KK E E ...
- 洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]
洛谷传送门,BZOJ传送门 树网的核 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V ...
随机推荐
- cesium的学习
一.学习资料:http://cesiumjs.org/tutorials.html,看完6个教程后对图层加载.控件控制开关.地形数据叠加.模型添加.相机控制.图形绘制有一点了解.这也是cesium的主 ...
- How To : Modify ASM SYS password using asmcmd 11g R2 and upper
修改RAC 11gR2及以上版本的ASM的SYS的密码方法 [grid]$ asmcmd ASMCMD> orapwusr --modify --password sys Enter passw ...
- cogs——49. 跳马问题
49. 跳马问题 水题 dfs裸基础 #include<cstdio> using namespace std; ]={,,,,}, ans,my[]={,-,,-,}; inline v ...
- C C++ POSIX 的一些 IO 操作
一些 C C++ POSIX 的 IO 操作总结 文件-内存之间 内存-内存之间 POSIX 有无缓冲的 IO 操作 对文件的操作,读文件至内存,从内存写至文件 // 读文件至内存buf中 void ...
- odoo api介绍
odoo api修饰器介绍与应用 参考文档:https://www.cnblogs.com/kfx2007/p/6093994.html 一.one one的用法主要用于self为单一集合的情况,被o ...
- Linux - nginx基础及常用操作
目录 Linux - nginx基础及常用操作 Tengine淘宝nginx安装流程 nginx的主配置文件nginx.conf 基于域名的多虚拟主机实战 nginx的访问日志功能 网站的404页面优 ...
- java.lang.ClassFormatError: Unknown constant tag 0 in class file
在通过文件上传之后,运行java程序,突然发现这么一个错误:java.lang.ClassFormatError: Unknown constant tag 0 in class file,通过网上查 ...
- asp.net--webservice--安全验证SoapHeader
服务端的设置 客户端设置,需要生成一个服务端的代理,调用服务端的方法
- 利用Calendar类测试电脑运行速度
今天学习了很多新知识! 这里使用了Calender类来获取系统时间,并计算循环1w次的时间,判断电脑处理时间. import java.util.Calendar; public class Arra ...
- oracle rac cache fusion
转载自 http://blog.csdn.net/tianlesoftware/article/details/6534239 Introduction This post is about orac ...