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写在第一行的中间. ...
随机推荐
- chromedriver与chrome版本对应
今天把手头有的一些关于selenium测试的资源整理了一下,分享出来. 1. 所有版本chrome下载 是不是很难找到老版本的chrome?博主收集了几个下载chrome老版本的网站,其中哪个下载的是 ...
- windowsEvents
今天我们要实现这个关闭窗口的功能,就是点窗口的那个叉叉它会关闭. 设计窗口的事件就是WindowsEvents,而与之有关的监听器就是WindowsListener WindowsListener也是 ...
- Android中集成第三方支付
常见的第三方支付解决方案 支付宝支付 微信支付 银联支付 Ping++统一支付平台(需要继承服务器端和客户端) 短信支付 支付宝的集成流程 相关资料链接: 支付宝支付指引流程:支付指引流程 支付宝An ...
- D. Mahmoud and a Dictionary 种类并查集
http://codeforces.com/contest/766/problem/D 所谓种类并查集,题型一般如下:给定一些基本信息给你,然后又给出一些信息,要求你判断是真是假.例如给出a和b支持不 ...
- 学JAVA第二十二天,StringBuffer的好处
五一的假期今天就结束了,又要回来上课了. 今天就写一下StringBuffer的好处吧. StringBuffer类的对象能够被多次的修改,并且不产生新的未使用对象. 也就是说,我们平时用String ...
- logging模块基础3
1.logging模块的日志级别 CRITICAL = 50 #FATAL = CRITICAL ERROR = 40 WARNING = 30 #WARN = WARNING INFO = 20 D ...
- poj3109 Inner Vertices
思路: 树状数组 + 扫描线. 实现: #include <cstdio> #include <vector> #include <algorithm> using ...
- css标签及属性
css标签及属性 HTML引入CSS的方法 1.嵌入式 <style type = “text/css”>要写的样式</style> 2.外联式 <link rel ...
- DOM简介及节点、属性、查找节点的方法
DOM(Document Object Modle) 操作文档的编程接口DOM定义了表示和修改文档的方法,不能修改css样式表,在js中使用DOM方法改变元素的css样式,实质上是在元素上添加行间样式 ...
- 掌握Spark机器学习库-08.7-决策树算法实现分类
数据集 iris.data 数据集概览 代码 package org.apache.spark.examples.examplesforml import org.apache.spark.Spark ...