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

面向数据编程。。

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

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

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

  1. #include<cstring>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. //#include<assert.h>
  5. //#include<time.h>
  6. #include<math.h>
  7. //#include<queue>
  8. #include<algorithm>
  9. #include<iostream>
  10. using namespace std;
  11.  
  12. bool isdigit(char c) {return c>='' && c<='';}
  13. int qread()
  14. {
  15. char c;int s=,f=;while (!isdigit(c=getchar())) f=(c=='-'?-:);
  16. do s=s*+c-''; while (isdigit(c=getchar())); return s*f;
  17. }
  18.  
  19. int T,n,ans;
  20. int a[],cnt[];
  21. int calc()
  22. {
  23. int ans=;
  24. memset(cnt,,sizeof(cnt));
  25. for (int i=;i<=;i++) cnt[a[i]]++;
  26. for (int i=;i<=;i++) cout<<cnt[i]<<' ';cout<<endl;
  27. bool wang=;
  28. if (a[] && a[]) cnt[]++,wang=;
  29. else if (a[] || a[]) cnt[]++;else{}
  30.  
  31. while (cnt[] && cnt[]>) ans++,cnt[]--,cnt[]-=;
  32. while (cnt[] && cnt[]>) ans++,cnt[]--,cnt[]-=;
  33. while (cnt[] && cnt[]) ans++,cnt[]--,cnt[]--;
  34. while (cnt[] && cnt[])
  35. {
  36. if (cnt[]== && wang) break;
  37. ans++,cnt[]--,cnt[]--;
  38. }
  39. ans+=cnt[]+cnt[]+cnt[]+cnt[];
  40. return ans;
  41. }
  42. void dfs(int dep)
  43. {
  44. if (dep>ans) return;
  45. int tmp=calc();
  46. if (dep+tmp<ans) ans=dep+tmp;
  47. //单顺子
  48. for (int i=;i<=;i++)
  49. {
  50. int j=i;
  51. while (j< && a[j]) j++;
  52. for (int play=i+;play<j;play++)
  53. {
  54. for (int k=i;k<=play;k++) a[k]--;
  55. dfs(dep+);
  56. for (int k=i;k<=play;k++) a[k]++;
  57. }
  58. }
  59. //连对
  60. for (int i=;i<=;i++)
  61. {
  62. int j=i;
  63. while (j< && a[j]>) j++;
  64. for (int play=i+;play<j;play++)
  65. {
  66. for (int k=i;k<=play;k++) a[k]-=;
  67. dfs(dep+);
  68. for (int k=i;k<=play;k++) a[k]+=;
  69. }
  70. }
  71. //三连对
  72. for (int i=;i<=;i++)
  73. {
  74. int j=i;
  75. while (j< && a[j]>) j++;
  76. for (int play=i+;play<j;play++)
  77. {
  78. for (int k=i;k<=play;k++) a[k]-=;
  79. dfs(dep+);
  80. for (int k=i;k<=play;k++) a[k]+=;
  81. }
  82. }
  83. }
  84. int main()
  85. {
  86. T=qread();
  87. n=qread();
  88. int x,y;
  89. while (T--)
  90. {
  91. memset(a,,sizeof(a));
  92. for (int i=;i<=n;i++)
  93. {
  94. x=qread();y=qread();
  95. if (x)
  96. {
  97. if (x>) a[x-]++;
  98. else a[x+]++;
  99. }
  100. else a[+y]++;
  101. }
  102. ans=n;dfs();
  103. printf("%d\n",ans);
  104. }
  105. return ;
  106. }

错误!有诸多未考虑到的情况,比如,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. AJPFX关于IO流的简单总结

    IO流的分类:1.根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader  低端流:所有的外界设备中的流都是低端流,比如InputStream,Output ...

  2. 技术杂记之:vi使用入门

    对于Linux的初次使用者来说,进入Linux非图形界面后,不知道怎么创建文本(甚至于在图形界面,也找不到创建文本的菜单).其实,每一个Linux的发行版本,都包含了一个最简单.也是最基础的文本编辑器 ...

  3. javascript中闭包与作用域的理解

    很多js的框架与插件编写都用到了闭包,所以,阅读和掌握闭包很有必要.最近学习vue框架时,经常会猜想很多功能的native js实现,很多都应用到了闭包,闭包除了目前已知的一些特性,如:可以保持局部变 ...

  4. JavaScript——max-age

    https://zhidao.baidu.com/question/391047416053664205.html 页面优化方式之一,延长过期时间.默认max-age=0

  5. 编写高质量Python代码的59个有效方法

    Python学习资料或者需要代码.视频加Python学习群:960410445 1. 用Pythonic方式思考 第一条:确认自己使用的Python版本 (1)有两个版本的python处于活跃状态,p ...

  6. Jmeter之https请求

    Jmeter之录制https脚本,网上介绍了好多种方法,大家自行百度. 如果手写https脚本,该如何做呢? 方法:http信息头管理器,加入User-Agent参数 案例:手写百度的搜索:哈哈  请 ...

  7. selenium兼容非标准chrome内核的浏览器

    多浏览器兼容性测试(1) RIDE已经支持多浏览器兼容性测试,例如: firefox ie chrome safari 但是,项目要求支持360极速和360安全浏览器.所以,我们需要增加代码让RIDE ...

  8. CE工具里自带的学习工具--第六关

    这一步原理: 相当于有一个变量 int a=100; int *p=&a; 点击修改值, 在ce工具里可以找到a的值.  a的地址. 但是在实际代码里,并不是这么处理的,  是 通过指针改变这 ...

  9. 纯CSS3来自定义单选框radio与复选框checkbox

    单选框(radio)自定义样式 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...

  10. CAD实现批量打印(网页版)

    主要用到函数说明: IMxDrawPrint::BatchPrintDialog 批量打印对话框,详细说明如下: 参数 说明 [in] IMxDrawResbuf* pParam 批量打印位置参数, ...