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 ...
随机推荐
- System.currentTimeMillis()与SystemClock.uptimeMillis()
1.System.currentTimeMillis()获取的是系统的时间,可以使用SystemClock.setCurrentTimeMillis(long millis)进行设置.如果使用Syst ...
- 使用jqgrid的C#/asp.net mvc开发者的福音 jqgrid-asp.net-mvc
你是否使用jqgrid? 你是否想在C#/asp.net mvc中使用jqgrid? 那你很可能曾经为了分析jqgrid的request url用fiddler忙活了2个小时.(如果你要使用jqgri ...
- 根据上一行填充本行的空白栏位,SQL处理方式
我在4年多前,写了一篇Excel处理空白Cell的文章,http://www.cnblogs.com/studyzy/archive/2010/04/07/1706203.html,其实在数据库中也会 ...
- 【Android】apk文件反编译
工具: 压缩软件:用于解压apk包 dex2jar:*.dex反编译为Jar包 jd-gui:查看Jar文件 (PS:不知道博客园如何上传附件,只能把工具挂到百度网盘了:http://pan.baid ...
- Win7家庭组的使用
Win7中有两种方式与他人共享文件,一种是“家庭组”,另一种是使用“工作组或域”. 家庭组是Win7中新增的一种共享文件方式,在传统的共享文件方式中必须手动设置所要共享的文件夹,而家庭组则不需要,只需 ...
- 编写BinIoDemo.java的Java应用程序,程序完成的功能是:完成1.doc文件的复制,复制以后的文件的名称为自己的学号姓名.doc。
package zuoye; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
- 0005 《SQL必知必会》笔记01-SELECT语句
1.SELECT基本语句: SELECT 字段名1,···,字段名n FROM 表名 2.检索所有字段,用"*"替换字段名,这会导致效率低下 SELECT * FROM 表名; 3 ...
- Linux简介及常用命令使用2--linux常用命令:查看 删除 编辑 创建等
cd . // 进入当前目录 cd ~ //进入根目录 pwd //当前路径 echo "my name is makaidong">makai ...
- SQL Server调优系列基础篇(子查询运算总结)
前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...
- JavaScript 产生指定范围随机数
function selectFrom(lowerValue, upperValue) { var choices = upperValue - lowerValue + 1; return Math ...