NOIP2013 花匠
题目描述
花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定
把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希
望剩下的花排列得比较别致。
具体而言,栋栋的花的高度可以看成一列整数h1,h2..hn。设当一部分花被移走后,剩下的花的高度依次为g1,g2..gn,则栋栋希望下面两个条件中至少有一个满足:
条件 A:对于所有g(2i)>g(2i-1),g(2i)>g(2i+1)
条件 B:对于所有g(2i)<g(2i-1),g(2i)<g(2i+1)
注意上面两个条件在m = 1时同时满足,当m > 1时最多有一个能满足。
请问,栋栋最多能将多少株花留在原地。
输入输出格式
输入格式:
输入文件为 flower .in。
输入的第一行包含一个整数n,表示开始时花的株数。
第二行包含n个整数,依次为h1,h2..hn,表示每株花的高度。
输出格式:
输出文件为 flower .out。
输出一行,包含一个整数m,表示最多能留在原地的花的株数。
输入输出样例
5
5 3 2 1 2
3
说明
【输入输出样例说明】
有多种方法可以正好保留 3 株花,例如,留下第 1、4、5 株,高度分别为 5、1、2,满
足条件 B。
【数据范围】
对于 20%的数据,n ≤ 10;
对于 30%的数据,n ≤ 25;
对于 70%的数据,n ≤ 1000,0 ≤ ℎi≤ 1000;
对于 100%的数据,1 ≤ n ≤ 100,000,0 ≤ hi≤ 1,000,000,所有的hi 随机生成,所有随机数服从某区间内的均匀分布。
题解1:动态规划
条件 A:对于所有g(2i)>g(2i-1),g(2i)>g(2i+1)
条件 B:对于所有g(2i)<g(2i-1),g(2i)<g(2i+1)
用h[i]表示第i株植物的高度。对于第i株植物,有两种情况,一是h[i]>h[i-1],二是h[i]<h[i-1]。
用s(0,i)表示第一种情况,s(1,i)表示第二种情况,f(0,i)表示s(0,i)能留下的植物量,f(1,i)表示s(1,i)能留下的植物量(不是最优值),其中i是区间[1,i]。下面考虑不完整的转移:
s(0,i)时,且满足情况B,那么此时留下植物量+1。即f(0,i)=f(1,i-1)+1
s(1,i)时,且满足情况A,那么此时留下植物量+1。即f(1,i)=f(0,i-1)+1
程序如下:
#include<cstdio>
using namespace std;
const int N=;
inline int dmx(int x,int y)
{
if(x>y)
return x;
return y;
}
int n,h[N],f1[N],f2[N];
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d",&h[i]);
f1[]=f2[]=;
for(int i=;i<n;i++){
if(h[i]>h[i-]){
f1[i]=f1[i-];
f2[i]=dmx(f2[i-],f1[i-]+);
}
if(h[i]<h[i-]){
f2[i]=f2[i-];
f1[i]=dmx(f1[i-],f2[i-]+);
}
if(!(h[i]^h[i-])){
f1[i]=f1[i-];
f2[i]=f2[i-];
}
}
printf("%d\n",dmx(f1[n-],f2[n-]));
}
题解2:
所有的hi 随机生成,所有随机数服从某区间内的均匀分布。可视作单调“抖动”序列。
对于情况1,贪心中间植物最高的高度
对于情况2,贪心中间植物最低的高度
#include<stdio.h>
#define N 100001
inline void F(int &x)
{
x=;int c=getchar(),f=;
for(;c<||c>;c=getchar())
if(!(c^))f=-;
for(;c>&&c<;c=getchar())
x=(x<<)+(x<<)+c-;
x*=f;
}
bool f;
int n,h[N],g[N];
int main()
{
F(n);
for(int i=;i<=n;i++)
F(h[i]);
g[++g[]]=h[];
g[++g[]]=h[];
f=h[]<=h[];
for(int i=;i<=n;i++){
if(!f)
g[g[]]<h[i]?
f=,g[++g[]]=h[i]:
g[g[]]=h[i];
else
g[g[]]>h[i]?
f=,g[++g[]]=h[i]:
g[g[]]=h[i];
}
printf("%d\n",g[]);
}
NOIP2013 花匠的更多相关文章
- Luogu 1970 NOIP2013 花匠 (贪心)
Luogu 1970 NOIP2013 花匠 (贪心) Description 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使 ...
- NOIP2013 花匠解题报告
//<NOIP2013> 花匠 /* 最优子结构性质,可以用动规.注意到存在30%的变态数据(1 ≤ n ≤ 100,000, 0 ≤ h_i ≤1,000,000),因此应当找到线性的算 ...
- [NOIP2013 花匠] 新人解题报告
本来按照老师的要求,我学OI的第一份解题报告应是在寒假完成的关于数据结构的基础题,但由于身体原因当时未能完成,那么就在省选赛前临时写几篇吧…… 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿 ...
- NOIP2013花匠
描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体而言, ...
- [DP][NOIP2013]花匠
花匠 问题描述: 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. ...
- NOIP2013 花匠 DP 线段树优化
网上一堆题解,我写的是N^2优化的那种,nlogn,O(n)的那种能看懂,但是让我自己在赛场写,肯定没戏了 #include <cstdio> #include <iostream& ...
- NOIP2013花匠(波动序列)
波动序列的定义不用多说,下面给出波动序列的求法. #include<iostream> #include<cstdio> #define N 100002 using name ...
- [题解+总结]NOIP动态规划大合集
1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...
- noip2017考前整理(未完)
快考试了,把我以前写过的题回顾一下.Noip2007 树网的核:floyd,推出性质,暴力.Noip2008 笨小猴:模拟Noip2008 火柴棒等式:枚举Noip2008 传纸条:棋盘dpNoip2 ...
随机推荐
- arcmap Command
The information in this document is useful if you are trying to programmatically find a built-in com ...
- [SharePoint] SharePoint 错误集 2
1 Run command “New-SPConfigurationDatabase" Feature Description: error message popup after run ...
- Git 分支管理策略
分支管理策略 下面我们来说一下一般企业中开发一个项目的分支策略: 主分支 master 开发分支 develop 功能分支 feature 预发布分支 release bug 分支 fixbug 其 ...
- Android开发实战(二十一):浅谈android:clipChildren属性
实现功能: 1.APP主界面底部模块栏 2.ViewPager一屏多个界面显示 3......... 首先需要了解一下这个属性的意思 ,即 是否允许子View超出父View的返回,有两个值true . ...
- VisualSVN Server的配置和使用方法 图文
转载 http://www.jb51.net/article/17365.htm VisualSVN Server是免费的,而VisualSVN是收费的.VisualSVN是SVN的客户端,和Visu ...
- 通过跳板机建立信任,对多个tomcat服务统一安装部署(shell编写)
unifyDeploy 自动化统一安装部署 系统版本: unifyDeploy0.1 文件编号: 0.1 发布日期: 2014-06-26 编 制: WangYong 版权所有 内部资料注意保密 ...
- 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)
哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...
- git技巧记录--子模块删除方法
把子模块推进去了,删掉吧(将子模块删除,然后提交推送),删除子模块步骤: 1.在Platform.Web库下,右键->Git Bash,进入git命令行窗口,输入:git rm –-cached ...
- vsftpd 配置详解
1.默认配置: 1>允许匿名用户和本地用户登陆. anonymous_enable=YES local_enable=YES 2>匿名用户使用的登陆名为ftp或anonymous,口令为空 ...
- 操作linux命令
一.Linux下重启Tomcat 1. 进入tomcat下的bin目录:cd /user/standard/tomcat/bin; 使用关闭命令:./shutdown.sh; 查看Java进程是否关闭 ...