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写在第一行的中间. ...
随机推荐
- 203 Remove Linked List Elements 删除链表中的元素
删除链表中等于给定值 val 的所有元素.示例给定: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6返回: 1 --& ...
- Heart Beat
实现关键: 1.纯css实现心形图(如果使用图片则无需) html代码: <!DOCTYPE html> <html> <head> <meta charse ...
- SQL将查询出来的多列的值拼接成一个字符串
-- 单列拼接,先查出一行,再加上逗号,接着拼接 查出的下一行 SELECT GROUP_CONCAT(user_id) FROM user; -- result 160,160,160,196 -- ...
- ARM开发板如何选型-I.MX6Q开发板
拥有丰富扩展能力,供货周期长的开发平台,省事安心 处理器:迅为-i.MX6开发板恩智浦Cortex-A9 四核i.MX6Q处理器,主频1GHz,内存2G,存储16GB. 系统支持:i.MX6开发板 ...
- charsets - 程序员对字符集和国际化的观点
描述 Linux 是一个国际性的操作系统.它的各种各样实用程序和设备驱动程序 (包括控制台驱动程序 ) 支持多种语言的字符集,包括带有附加符号的拉丁字母表字符,重音符,连字(字母结合), 和全部非拉丁 ...
- ALTER OPERATOR CLASS - 修改一个操作符表的定义
SYNOPSIS ALTER OPERATOR CLASS name USING index_method RENAME TO newname DESCRIPTION 描述 ALTER OPERATO ...
- 关于TreeView控件的TreeNodeCheckChanged事件无法回发处理
1.在后台设置属性 TreeView1.Attributes.Add("onclick", "postBackByObject()"); 2.在前台页面中间添加 ...
- cuda输出
cuda的输出就是printf 可以在屏幕上显示出来,但你修改之后一定要make编译,不然只是修改了源代码,但生成的可执行文件还是之前编译的
- 如何HTML标签和JS中设置CSS3 var变量
一.HTML标签中设置CSS变量 如下: <div style="--color: #cd0000;"> <img src="mm.jpg" ...
- 201621123082《Java程序设计》第1周学习总结
1. 本周学习总结: 关键词: 了解Java语言的发展历史.了解Java语言的特点.JDK.JRE.JVM.eclipse等. 联系: JDK是提供给Java开发人员使用的一组工具,JDK包含JVM及 ...