51Nod--1285-山峰和分段

1285 山峰和分段

题目来源: Codility

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题

 收藏

 关注

用一个长度为N的整数数组A,描述山峰和山谷的高度。山峰需要满足如下条件, 0 < P < N - 1 且 A[P - 1] < A[P] > A[P + 1]。

以上图为例,高度为:1 5 3 4 3 4 1 2 3 4 6 2。

现在要将整个山分为K段,要求每段的点数都一样,且每段中都至少存在一个山峰,问最多可以分为多少段。

Input

第1行:一个数N,表示数组的长度(1 <= N <= 50000)。
第2 - N + 1行:每行1个数Ai(1 <= Ai <= 10^9)。

Output

输出最多可以将山分为多少段。

Input示例

12
1
5
3
4
3
4
1
2
3
4
6
2

Output示例

3

题解: 数据量不大,使用直接法解决。就是题意有点难理解。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 50005; 

int n, num[MAXN], cnt[MAXN];

bool Judge(int cur){
	for(int i=cur; i<=n; i+=cur){
		if(cnt[i] - cnt[i-cur] < 1){
			return false;
		}
	}
	return true;
} 

int main(){
	int ans, mot;
	while(scanf("%d", &n) != EOF){
		for(int i=1; i<=n; ++i){
			scanf("%d", &num[i]);
		}
		mot = 0;
		cnt[1] = cnt[0] = 0;
		for(int i=2; i<n; ++i){
			if(num[i] > num[i-1] && num[i] > num[i+1]){
				mot++;
				cnt[i] = cnt[i-1] + 1;
			}else{
				cnt[i] = cnt[i-1];
			}
		}
		cnt[n] = cnt[n-1];
		ans = 1;
		if(mot == 0){
		    ans = 0;
		}
		for(int i=mot; i>=2; --i){
			if( (n%i == 0) && Judge(n/i)){
				ans = i;
				break;
			}
		}
		printf("%d\n", ans );
	}
	return 0;
}

  

时间: 2024-12-19 12:13:40

51Nod--1285-山峰和分段的相关文章

51nod——1285 山峰和分段(暴力出奇迹)

要求每段的点数都一样,因此分的段数cnt肯定是n的因子,要求每段都有山峰,因此cnt肯定小于等于山峰数量.分段的宽度d=n/cnt,对山峰数量做一个前缀和,检查一下每一段的山峰数量是否没有增加即可. 1 ///暴力枚举段数 2 #include <bits/stdc++.h> 3 using namespace std; 4 #define maxn 50050 5 int high[maxn],num[maxn]; 6 7 int main(){ 8 std::ios::sync_with_

51Nod1285 山峰和分段

Problem 用一个长度为N的整数数组A,描述山峰和山谷的高度.山峰需要满足如下条件, 0 < P < N - 1 且 A[P - 1] < A[P] > A[P + 1]. 现在要将整个山分为K段,要求每段的点数都一样,且每段中都至少存在一个山峰,问最多可以分为多少段. Solution 枚举因数,前缀和优化查询. 复杂度是因子之和,试了一下,1e6之内一个大于5*n的也没有,最大比率4.5多一点. Code #include<stdio.h> #include&l

51nod 1201 整数划分(dp)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 题解:显然是一道dp,不妨设dp[i][j]表示数字i分成j个一共有几种分法. 那么转移方程式为: dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] 表示将i - 1划分为j个数,然后j个数都+1 还是不重复,将i - 1划分为j - 1个数,然后j - 1个数都+1,再加上1这个数. 然后就是j的范围要知道1+2+

51nod 1138 连续整数的和(数学)

题目描述: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1138 给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2).例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8.如果不能写为若干个连续整数的和,则输出No Solution. Input 输入1个数N(3 <= N <= 10^9). OutPut 输出连续整数中的第1个数,如果有多

CODEVS-1531 山峰

题目描述 Description Rocky山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, --, n.每个山峰的高度都是不一样的.编号为i的山峰高度为hi. 小修从西往东登山.每到一座山峰,她就回头观望自己走过的艰辛历程.在第i座山峰,她记录下自己回头能看到的山峰数si. 何谓"能看到"?如果在第i座山峰,存在j<k<i,hj<hk,那么第j座山峰就是不可见的.除了不可见的山峰,其余的山峰都是可见的. 回家之后,小修把所有的si加起来得到S作为她此次旅

关于ajax分段上传文件实例~

本来打算写的勤快一点的,谁知道最近好忙啊,忙着应聘的事情,这里突然想提一下自己的历程 自己现在是一只大三狗,高中三年是玩过去了,上了一所省内普通的不能再普通的二本.不过在大学里还算的上勤奋,大一上在学生会搅搅水,大一下就开始在学校网络中心里面干活,网络维护是工作,编程是兴趣,基本上每天网络中心寝室两点一线,所以说还算得上勤奋.不过现在我自己算是明白,很多事情不是勤奋就好了的,方法不对,真的是事倍功半.自己之前学习东西都是瞎倒腾,看书,看视频,记笔记,写demo.看起来稀疏平常,但是自己缺点在于太

51nod 1463 找朋友(线段树+离线处理)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1463 题意: 思路: 好题! 先对所有查询进行离线处理,按照右区间排序,因为k一共最多只有10个,所有在该区间内的B数组,每次枚举K值,通过这样的方式来得到另外一个B值.但是这样得到的B值它在B数组中的位置必须在当前数的左边.如下图:(j为当前数在B数组中的位置,pos为计算得到的另一个B值在数组中的位置) 这两个数的和记录在pos中,这里pos的位置必须在j的左边,假

51nod 1437

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1437 1437 迈克步 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 有n只熊.他们站成一排队伍,从左到右依次1到n编号.第i只熊的高度是ai. 一组熊指的队伍中连续的一个子段.组的大小就是熊的数目.而组的力量就是这一组熊中最小的高度. 迈克想知道对于所有的组大小为x(1 ≤ x ≤ n

51nod 1272 思维/线段树

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1272 1272 最大距离 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 给出一个长度为N的整数数组A,对于每一个数组元素,如果他后面存在大于等于该元素的数,则这两个数可以组成一对.每个元素和自己也可以组成一对.例如:{5, 3, 6, 3, 4, 2},可以组成11对,如下(数字为下标):