题目: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 ] 斗地主 —— 搜索+贪心的更多相关文章

  1. Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)

    Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...

  2. 洛谷P1378 油滴扩展(搜索)

    洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #in ...

  3. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  4. 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]

    P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...

  5. 随手练——洛谷-P1151(枚举与暴力搜索)

    枚举 #include <iostream> using namespace std; int main() { ; cin >> k; ; i < ; i++) { ) ...

  6. 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)

    科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...

  7. 随手练——洛谷-P1008 / P1618 三连击(暴力搜索)

    1.普通版 第一眼看到这个题,我脑海里就是,“我们是不是在哪里见过~”,去年大一刚学C语言的时候写过一个类似的题目,写了九重循环....就像这样(在洛谷题解里看到一位兄台写的....超长警告,慎重点开 ...

  8. 洛谷 P1013 进制位 【搜索 + 进制运算】

    题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E KL KK E E ...

  9. 洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]

    洛谷传送门,BZOJ传送门 树网的核 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V ...

随机推荐

  1. cesium的学习

    一.学习资料:http://cesiumjs.org/tutorials.html,看完6个教程后对图层加载.控件控制开关.地形数据叠加.模型添加.相机控制.图形绘制有一点了解.这也是cesium的主 ...

  2. 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 ...

  3. cogs——49. 跳马问题

    49. 跳马问题 水题 dfs裸基础 #include<cstdio> using namespace std; ]={,,,,}, ans,my[]={,-,,-,}; inline v ...

  4. C C++ POSIX 的一些 IO 操作

    一些 C C++ POSIX 的 IO 操作总结 文件-内存之间 内存-内存之间 POSIX 有无缓冲的 IO 操作 对文件的操作,读文件至内存,从内存写至文件 // 读文件至内存buf中 void ...

  5. odoo api介绍

    odoo api修饰器介绍与应用 参考文档:https://www.cnblogs.com/kfx2007/p/6093994.html 一.one one的用法主要用于self为单一集合的情况,被o ...

  6. Linux - nginx基础及常用操作

    目录 Linux - nginx基础及常用操作 Tengine淘宝nginx安装流程 nginx的主配置文件nginx.conf 基于域名的多虚拟主机实战 nginx的访问日志功能 网站的404页面优 ...

  7. java.lang.ClassFormatError: Unknown constant tag 0 in class file

    在通过文件上传之后,运行java程序,突然发现这么一个错误:java.lang.ClassFormatError: Unknown constant tag 0 in class file,通过网上查 ...

  8. asp.net--webservice--安全验证SoapHeader

    服务端的设置 客户端设置,需要生成一个服务端的代理,调用服务端的方法

  9. 利用Calendar类测试电脑运行速度

    今天学习了很多新知识! 这里使用了Calender类来获取系统时间,并计算循环1w次的时间,判断电脑处理时间. import java.util.Calendar; public class Arra ...

  10. oracle rac cache fusion

    转载自 http://blog.csdn.net/tianlesoftware/article/details/6534239 Introduction This post is about orac ...