51nod 1281山峰和旗子

第1行:一个数N,表示数组的长度(1 <= N <= 50000)。
第2 - N + 1行:每行1个数Ai(1 <= Ai <= 10^9)。
输出最多能插上多少面旗子(即求K的最大值)。
12
1
5
3
4
3
4
1
2
3
4
6
2
3 思路:二分+dp-------用一个f[]数组保存山峰的位置,首先如果没有山峰则直接输出0,其次距离越大代表我们要插的旗子数就越大,我们枚举旗子的个数k 找到最大的可行方案;当然直接枚举会超时,所以这里需要用二分来枚举;
对于每一个k我们需要用一次dp数组来遍历一次,dp[i]代表前i个位置能插入距离为k的旗子的个数;我们可以得到递推公式 若当前位置不可以插旗子dp[i] = dp[i-1];否则dp[i] = max(dp[i-k]+1,dp[i]);
其中i-k>0;遍历完之后若dp[n-1]>=k说明我们的k还可以继续增大,直到dp[n-1]恰好等于k的时候就停止二分,此时的k即为最大值
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const int maxn = ;
LL n,a[maxn],f[maxn],d[maxn];;
int main()
{
ios::sync_with_stdio(false);
// freopen("in.txt","r",stdin);
while(cin>>n){
int flag = ;
for(int i=;i<n;i++)cin>>a[i];
for(int i=;i<n-;i++)
if(a[i]>a[i-]&&a[i]>a[i+]){
f[i] = ;flag++;
}
if(!flag){
cout<<""<<endl;
continue;
}
int l=,r=n,ans=;
while(l<r){
int k = (l+r)>>;
for(int i=;i<n;i++)
d[i] = f[i];
for(int i=;i<n;i++){
if(!f[i])d[i]=d[i-];
else if(i-k>) d[i] = max(d[i-k]+,d[i]);
}
if(d[n-]>=k){
ans = k;
l = k+;
}else r = k;
}
cout<<ans<<endl;
}
return ;
}
51nod 1281山峰和旗子的更多相关文章
- 51nod 1281 二分
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1281 隐藏话题 1281 山峰和旗子 题目来源: Codility 基准 ...
- 51nod——1285 山峰和分段(暴力出奇迹)
要求每段的点数都一样,因此分的段数cnt肯定是n的因子,要求每段都有山峰,因此cnt肯定小于等于山峰数量.分段的宽度d=n/cnt,对山峰数量做一个前缀和,检查一下每一段的山峰数量是否没有增加即可. ...
- 51nod 1285 山峰和分段
[题解] 枚举n的各个因数作为段长,O(n)判断每一段内是否有山峰即可. #include<cstdio> #include<cstring> #include<algo ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
- 51Nod 1278 相离的圆
51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...
- 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...
- 【51Nod 1622】【算法马拉松 19C】集合对
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...
随机推荐
- man命令及help命令
一.man命令 man命令常用工具命令 man命令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助.配置文件帮助和编程帮助等信息. 语法: man(选项)(参数) 选项: -a: ...
- 【怪物】KMP畸形变种——扩展KMP
问题 参考51nod1304这道题: 很显然我们要求的是S的每个后缀与S的最长公共前缀的长度之和. 暴力 假设我们把next[i]表示为第i个后缀与S的最长公共前缀的长度. 现在我们想了:这个next ...
- iOS9 CASpringAnimation 弹簧动画详解
http://blog.csdn.net/zhao18933/article/details/47110469 1. CASpringAnimation iOS9才引入的动画类,它继承于CABaseA ...
- Leetcode811.Subdomain Visit Count子域名访问计数
一个网站域名,如"discuss.leetcode.com",包含了多个子域名.作为顶级域名,常用的有"com",下一级则有"leetcode.com ...
- Linux中的库
一.基本概念 1.1.什么是库 在 windows 平台和 linux 平台下都大量存在着库. 本质上来说库是一种可执行的二进制代码(但不可以独立执行),可以被操作系统载入内存执行. 由 ...
- Linux下C 更改字符在终端的显示颜色
使用\033[01;04;32;41m之类的配色方案在需要输出显示的文本之前,可以改变应用程序输出文本的颜色或者背景颜色. 比如: #include <stdio.h> int main( ...
- 【JZOJ4887】【NOIP2016提高A组集训第13场11.11】最大匹配
题目描述 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存 ...
- KiCad EDA 镜像目录说明
KiCad EDA 镜像目录说明 stable/ -- 稳定版安装包. testing/ -- 测试安装包. nightly/ -- 每日编译安装包. 5.1 版本的每日编译包,这个文件夹是重点,如果 ...
- js错误处理Try-catch和throw
1.try-catch语句 Try{ //可能会导致错误的代码 }catch(error){ //在错误发生时怎么处理 } 例如: try{ window.someNonexistentFunct ...
- 应用中弹出 WiFi 提示框的方法
如果 iOS 程序中用到了 WiFi,想有 WiFi 提示,只需要在 .plist 文件中加入如下 Key/Value 即可: 键名:ApplicationusesWi-Fi 值:YES 键名:SBU ...