题目 3334: 蓝桥杯2025年第十六届省赛真题-园艺
时间限制: 2s 内存限制: 192MB 提交: 129 解决: 37
题目描述
小蓝从左到右种了 n 棵小树,第 i 棵树的高度为 hi ,相邻树的间隔相同。 小蓝想挪走一些树使得剩下的树等间隔分布,且从左到右高度逐渐上升(相邻 两棵树高度满足右边的比左边的高),小蓝想知道最多能留下多少棵树。
输入格式
输入的第一行包含一个正整数 n 。
第二行包含 n 个正整数 h1, h2, · · · , hn ,相邻整数之间使用一个空格分隔。
输出格式
输出一行包含一个整数表示答案。
样例输入复制
6
3 5 4 7 6 7
样例输出复制
3
提示
【样例说明】
留下第 1、3、5 棵树,它们等间隔且从左到右高度逐渐上升。
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ n ≤ 500 ;
对于 60% 的评测用例,1 ≤ n ≤ 3000 ;
对于所有评测用例,1 ≤ n ≤ 5000 ,0 < hi < 106 。
1.分析
遍历所有开始下标和间隔。
注意要实时更新数量,可能不连续。
2.代码
cpp
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int MAX = 1e4 + 10;
typedef long long LL;
int n,a[MAX],re;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
for (int k = 0; k <= i; k++) {
int num = 0, t = -1;
for (int j = k; j < n; j += i + 1) {
if (a[j] > t) {
t = a[j];
num++;
re = max(re, num);
}
else {
num = 1;
t = a[j];
}
}
}
}
cout << re << endl;
return 0;
}