问一副排n张,n<=23最少打几次打完,数据组数T<=100。

面向数据编程。。

前30分:乱暴力?没有顺子,把单、对子、炸弹、三张、王炸、三带一判一次即可。

前70分:状压,先预处理哪些状态能一次出完,用这些状态来转移,2^n*n*T。实际得分可能比期望的高一些??

满分:如果不打顺子,最优策略是可以确定的,三和四的能带走一二的就带走。所以dfs打顺子,然后贪心出剩下的牌。可以把ans做全局变量,然后搜索时>ans就退出以剪枝。

 #include<cstring>
#include<cstdlib>
#include<cstdio>
//#include<assert.h>
//#include<time.h>
#include<math.h>
//#include<queue>
#include<algorithm>
#include<iostream>
using namespace std; bool isdigit(char c) {return c>='' && c<='';}
int qread()
{
char c;int s=,f=;while (!isdigit(c=getchar())) f=(c=='-'?-:);
do s=s*+c-''; while (isdigit(c=getchar())); return s*f;
} int T,n,ans;
int a[],cnt[];
int calc()
{
int ans=;
memset(cnt,,sizeof(cnt));
for (int i=;i<=;i++) cnt[a[i]]++;
for (int i=;i<=;i++) cout<<cnt[i]<<' ';cout<<endl;
bool wang=;
if (a[] && a[]) cnt[]++,wang=;
else if (a[] || a[]) cnt[]++;else{} while (cnt[] && cnt[]>) ans++,cnt[]--,cnt[]-=;
while (cnt[] && cnt[]>) ans++,cnt[]--,cnt[]-=;
while (cnt[] && cnt[]) ans++,cnt[]--,cnt[]--;
while (cnt[] && cnt[])
{
if (cnt[]== && wang) break;
ans++,cnt[]--,cnt[]--;
}
ans+=cnt[]+cnt[]+cnt[]+cnt[];
return ans;
}
void dfs(int dep)
{
if (dep>ans) return;
int tmp=calc();
if (dep+tmp<ans) ans=dep+tmp;
//单顺子
for (int i=;i<=;i++)
{
int j=i;
while (j< && a[j]) j++;
for (int play=i+;play<j;play++)
{
for (int k=i;k<=play;k++) a[k]--;
dfs(dep+);
for (int k=i;k<=play;k++) a[k]++;
}
}
//连对
for (int i=;i<=;i++)
{
int j=i;
while (j< && a[j]>) j++;
for (int play=i+;play<j;play++)
{
for (int k=i;k<=play;k++) a[k]-=;
dfs(dep+);
for (int k=i;k<=play;k++) a[k]+=;
}
}
//三连对
for (int i=;i<=;i++)
{
int j=i;
while (j< && a[j]>) j++;
for (int play=i+;play<j;play++)
{
for (int k=i;k<=play;k++) a[k]-=;
dfs(dep+);
for (int k=i;k<=play;k++) a[k]+=;
}
}
}
int main()
{
T=qread();
n=qread();
int x,y;
while (T--)
{
memset(a,,sizeof(a));
for (int i=;i<=n;i++)
{
x=qread();y=qread();
if (x)
{
if (x>) a[x-]++;
else a[x+]++;
}
else a[+y]++;
}
ans=n;dfs();
printf("%d\n",ans);
}
return ;
}

错误!有诸多未考虑到的情况,比如,4张3,4张3,3张5,可以两次打完;4张3,3张4,3张5,2张6,也可以两次打完。。。

不过这样可以满足网上大部分的数据了。。

NOIP2015提高组D1T3 斗地主的更多相关文章

  1. TYVJ4239 [NOIP2015提高组DayT3]斗地主

    P2668 斗地主 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中, 牌的大小关系根据牌的数码表示如 ...

  2. 【题解】NOIP2015提高组 复赛

    [题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...

  3. [NOIP2015] 提高组 洛谷P2615 神奇的幻方

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  4. 洛谷-神奇的幻方-NOIP2015提高组复赛

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  5. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  6. 【数据结构】运输计划 NOIP2015提高组D2T3

    [数据结构]运输计划 NOIP2015提高组D2T3 >>>>题目 [题目描述] 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航 ...

  7. 【二分查找】 跳石头NOIP2015提高组 D2T1

    [二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...

  8. 刷题总结——子串(NOIP2015提高组)

    题目: 题目背景 NOIP2015 提高组 Day2 T2 题目描述 有两个仅包含小写英文字母的字符串 A 和 B .现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在 ...

  9. noip2015 提高组 day1t1 神奇的幻方

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

随机推荐

  1. jmeter(五)集合点

    集合点: 简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念,我们可以在需要压力的地方设置集合点,每到输入用户名和密码登录时,所有的虚拟 ...

  2. [BZOJ2456]mode 其它

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2456 这道题有着神奇的内存限制1MB也就是说我们是没办法把读入的数字存下来的. 由于答案求 ...

  3. [BZOJ1025][SCOI2009]游戏 DP+置换群

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1025 题目中的排数就是多少次回到原来的序列.很显然对于题目所描述的任意一种对应法则,其中一 ...

  4. call方法的使用bug--参数undefined

    call/apply是函数原型定义的方法(Function.prorotype),在使用时要注意第一个形参(args[0]),一定是指向函数所要挂载的上下文对象--context,若对象非必须,则要将 ...

  5. Eclipse打包多渠道包

    下面介绍的是在eclipse中使用gradle进行多渠道打包(添加签名+混淆) 1,首先新建一个android测试项目,结构如下图所示: 2,选中右键选择expert->生成gradle文件,如 ...

  6. js基础盲点

    var myarray= new Array(8); //创建数组,存储8个数据. 注意:1.创建的新数组是空数组,没有值,如输出,则显示undefined.2.虽然创建数组时,指定了长度,但实际上数 ...

  7. 迅为iMX6UL开发板低功耗高能效开发平台

    迅为i.MX 6UL开发板基于ARM Cortex-A7内核,主频高达528 MHz,内存:512MDDR3,存储:8G EMMC,支持2路CAN,2路百兆以太网,4路USB HOST,8路串口,以及 ...

  8. 框架开发之Java注解的妙用

    注解的好处:1.能够读懂别人写的代码,特别是框架相关的代码.2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以使用一个或者多个注解来替代,这样就使得编程更加简洁,代码更加清晰.3.(重点 ...

  9. zend studio汉化离线语言包安装方法

  10. CAD参数绘制块引用对象(网页版)

    主要用到函数说明: _DMxDrawX::DrawBlockReference 绘制块引用对象.详细说明如下: 参数 说明 DOUBLE dPosX 插入点的X坐标 DOUBLE dPosY 插入点的 ...