NOIP2015提高组D1T3 斗地主
问一副排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 斗地主的更多相关文章
- TYVJ4239 [NOIP2015提高组DayT3]斗地主
P2668 斗地主 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中, 牌的大小关系根据牌的数码表示如 ...
- 【题解】NOIP2015提高组 复赛
[题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...
- [NOIP2015] 提高组 洛谷P2615 神奇的幻方
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
- 洛谷-神奇的幻方-NOIP2015提高组复赛
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
- 【数据结构】运输计划 NOIP2015提高组D2T3
[数据结构]运输计划 NOIP2015提高组D2T3 >>>>题目 [题目描述] 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航 ...
- 【二分查找】 跳石头NOIP2015提高组 D2T1
[二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...
- 刷题总结——子串(NOIP2015提高组)
题目: 题目背景 NOIP2015 提高组 Day2 T2 题目描述 有两个仅包含小写英文字母的字符串 A 和 B .现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在 ...
- noip2015 提高组 day1t1 神奇的幻方
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
随机推荐
- AJPFX关于IO流的简单总结
IO流的分类:1.根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader 低端流:所有的外界设备中的流都是低端流,比如InputStream,Output ...
- 技术杂记之:vi使用入门
对于Linux的初次使用者来说,进入Linux非图形界面后,不知道怎么创建文本(甚至于在图形界面,也找不到创建文本的菜单).其实,每一个Linux的发行版本,都包含了一个最简单.也是最基础的文本编辑器 ...
- javascript中闭包与作用域的理解
很多js的框架与插件编写都用到了闭包,所以,阅读和掌握闭包很有必要.最近学习vue框架时,经常会猜想很多功能的native js实现,很多都应用到了闭包,闭包除了目前已知的一些特性,如:可以保持局部变 ...
- JavaScript——max-age
https://zhidao.baidu.com/question/391047416053664205.html 页面优化方式之一,延长过期时间.默认max-age=0
- 编写高质量Python代码的59个有效方法
Python学习资料或者需要代码.视频加Python学习群:960410445 1. 用Pythonic方式思考 第一条:确认自己使用的Python版本 (1)有两个版本的python处于活跃状态,p ...
- Jmeter之https请求
Jmeter之录制https脚本,网上介绍了好多种方法,大家自行百度. 如果手写https脚本,该如何做呢? 方法:http信息头管理器,加入User-Agent参数 案例:手写百度的搜索:哈哈 请 ...
- selenium兼容非标准chrome内核的浏览器
多浏览器兼容性测试(1) RIDE已经支持多浏览器兼容性测试,例如: firefox ie chrome safari 但是,项目要求支持360极速和360安全浏览器.所以,我们需要增加代码让RIDE ...
- CE工具里自带的学习工具--第六关
这一步原理: 相当于有一个变量 int a=100; int *p=&a; 点击修改值, 在ce工具里可以找到a的值. a的地址. 但是在实际代码里,并不是这么处理的, 是 通过指针改变这 ...
- 纯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 ...
- CAD实现批量打印(网页版)
主要用到函数说明: IMxDrawPrint::BatchPrintDialog 批量打印对话框,详细说明如下: 参数 说明 [in] IMxDrawResbuf* pParam 批量打印位置参数, ...