有一排高度依次为H1,H2,H3,....,Hn的树木,一共n棵树,如果某棵树(不含两端的树)比相邻的两棵树都要高,则这样的树就称为景点树,现在管理员要将这n棵树划分成连续等长的部分进行管理,并且每部分之中至少含有一棵景点树。管理员希望划分的部分个数最大,你能帮助他吗?
输入描述:
有多组测数数据,每组数据有两行,第一行包含一个正整数n(0<n<100000),第二行包含n个正整数,分别表示H1,H2,H3,....,Hn,(0<Hi<2^30)。
输入以文件结束。
输出描述:
对于每组数据,输出相应的答案。
思路:主要就是用一个辅助数组sum[n],其中sum[k]表示从第1棵树到第k棵树这个区间景点数的个数,
然后判断一个区间[i, j]是否有景点树即为判断sum[i-1]是否等于sum[j]。
代码如下:
#include <iostream>
#define inf 0x7fffffff
#define MOD 1000000007
using namespace std;
const int maxn = 0x7fffffff;
int array[100001];
int sum[100001];
int main() {
int n;
while(scanf("%d", &n) !=EOF) {
int i, j;
for(i=1; i<=n; i++) {
scanf("%d", &array[i]);
}
fill_n(sum, n+1, 0);
for(i=2; i<n; i++) {
if(array[i] > array[i-1] && array[i] > array[i+1])
sum[i] = 1;
}
for(i=2; i<=n; i++)
sum[i] += sum[i-1];
for(i=1; i<=n; i++) {
int l=1, r=i;
if(n%i == 0) {
while(r<=n) {
if(sum[l-1] == sum[r])
break;
l+=i;
r+=i;
}
if(r > n)
break;
}
}
if(i>n)
printf("0\n");
else
printf("%d\n", n/i);
}
return 0;
}