题目: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. mongodb分片集群安装教程

    mongodb 集群包含副本集群,主从集群以及分片集群,分片集群比较复杂,这里测试我采用了三台机器,交差部署 blog地址:http://www.cnblogs.com/caoguo 一 .环境:#m ...

  2. PHP 之phpqrcode类库生成二维码

    <?php /** * Created by PhpStorm. * User: 25754 * Date: 2019/6/4 * Time: 15:53 */ include "./ ...

  3. groupbox

    使用groupbox将radiobox 放入其中可以使组框中只选中一个

  4. Oracle 【基 本 操 作】

    1.日期时间 select SYSDATE from DUAl; select TO_CHAR(SYSDATE, 'YYYY-MM-DD') from DUAL; select TO_CHAR(SYS ...

  5. Python变量的命名 单下划线和双下划线

    python命名变量的区别 foo: 一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突,就是例如__init__(),__del__(),__call__()这些特殊方法 _f ...

  6. UVA1001 Say Cheese(Dijkstra或Floyd)

    题目链接:UVA1001 题意:在一个巨大奶酪中的A要以最短的时间与B相遇.在奶酪中走一米的距离花费的时间是10s,而奶酪中有许多洞,穿过这些洞的时间是0s.给出A.B以及各个洞的坐标,求最短的时间. ...

  7. webpack-dev-server和webpack

    指导小伙伴在webstorm+nodejs环境下新建项目时,小伙伴出现了一个很神奇的问题:没有执行webpack-dev-server情况下,即使执行npm init,也不会出现package.jso ...

  8. 曾经遇过的sql问题

    曾经遇过的sql问题 问题一: 语句1: select SUM(level) from Comment 语句2: ELSE SUM(level) END as totalLevel from Comm ...

  9. sql server的 between and 日期问题

  10. Jmeter 学习imooc

    https://www.imooc.com/video/14718 1. BS Vs CS BS架构: browser server CS架构: Client server(安装到本地)