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 ...
随机推荐
- [GitHub] GitHub使用教程for Eclipse
1.下载egit插件 打开Eclipse,git需要eclipse授权,通过网页是无法下载egit的安装包的.在菜单栏依次打开eclipse→help→install new software→add ...
- NSString学习
基本概念 NSString是以UTF-16 code uint的序列.所有的长度.字符.范围都是以16比特platform-endian(大端序小段序基于平台)的形式表示的. 所以,一个英文字母的长度 ...
- android中Post方式发送HTTP请求
Post方式比Get方式要复杂一点,因为该方式需要将请求的参数放在http请求的正文中,所以需要构造请求体. 步骤: 1.构造URL URL url = new URL(PATH); 2.设置连接 H ...
- XCode模拟器上下黑边、显示不完整、适配问题
其实出现上下黑边是因为iOS默认将启动时的LaunchImage的宽高当成程序的宽高,所以启动图片如果只有小屏的图片,那么就会出现大屏状态下屏幕不能满屏的错误. 解决方法: 添加所有尺寸屏幕的Laun ...
- Android 手机卫士--阶段小结1
本文地址:http://www.cnblogs.com/wuyudong/p/5904528.html,转载请注明源地址. 本文对之前手机卫士开发进行一个小结. 1.SplashActivity 版本 ...
- 你真的了解NSNotificationCenter吗?
一:首先查看一下关于NSNotificationCenter的定义 @interface NSNotificationCenter : NSObject { @package void * __str ...
- 【代码笔记】iOS-iCarouselDemo
一,效果图. 二,工程图. 三,代码. RootViewController.h RootViewController.m myCell.h #import <UIKit/UIKit.h> ...
- Xcode常用快捷键的使用
熟练使用Xcode的一些快捷方式,会大大加快项目开发的速度.
- Java 线程异常处理器
Thread.UncaughtExceptionHandler 是Thread类的一个静态内部接口,该接口只有一个方法: void uncaughtException(Thread t, Throwa ...
- [转]listview加载性能优化ViewHolder
当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建. ListView加载数据都是在public View getView( ...