题目: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. 提高mysql千万级大数据SQL查询优化几条经验

    凯哥java                             微信号                             kaigejava 功能介绍                    ...

  2. android studio 控件提示大写

    方法一: 在第一行找到File进入找到setting,找到code completion 右侧复选框 选择-->None—->ok 方法二:<item name="andr ...

  3. lnmp环境搭建后续-php安装

    安装PHP7: 下载# wget http://PHP.net/get/php-7.0.2.tar.gz/from/a/mirror 建议安装之前先看看安装帮助文件INSTALL 解压安装 # tar ...

  4. C# Winform 最大化后 任务栏还显示解决

    //最大化 this.WindowState = FormWindowState.Maximized; //窗体最大化时 非全屏 不会遮盖任务栏 //去掉标题栏 this.FormBorderStyl ...

  5. illumina测序原理

    一些常用基本概念的介绍: flowcell流动池 是指Illumina测序时,测序反应发生的位置,1个flowcell含有8条lane lane通道 每一个flowcell上都有8条泳道,用于测序反应 ...

  6. CentOS安装Nodejs-v8.11.1

    (1)到NodeJs官网(https://nodejs.org/en/download/),复制下载链接 (2)下载并解压 命令:wget https://nodejs.org/dist/v8.11. ...

  7. js基本类型的包装对象

    var test = "test"; test.a = "hello"; console.log(test.a); 在JavaScript中,“一切皆对象”,数 ...

  8. ELK6 收集不同来源的日志并做区分

    https://blog.csdn.net/u010871982/article/details/79035317 使用filebeat替代logstash进行日志采集 https://blog.cs ...

  9. ganglia3.7.2,web3.7.1安装

    1.准备安装包 ganglia-3.7.2-2.el6.x86_64.rpm ganglia-gmetad-3.7.2-2.el6.x86_64.rpm ganglia-gmond-3.7.2-2.e ...

  10. linux修改mysql表结构

    增加字段: alter table [tablename] add [字段名] [字段类型] first(首位); alter table [tablename] add [字段名] [字段类型] a ...