题目描述
在森林里有一排树。第i棵树的高度是Di。有一只家雀儿,它在第一棵树上,它只有到最后一棵树的顶端才能找到食物
然而,这只鸟力气比较小,无法直接飞到那里。小鸟如果在第i棵树,那么他可以跳到第i+1,i+2,...,i+k棵树,然后必须休息。而且,向上飞要比向下飞难得多。 如果雏鸟跳到一棵不矮于当前树的树,那么他的劳累值会+1,否则不会累积疲劳值(可以滑翔)。 我们如果在飞翔的过程中有目的地选择小鸟降落的树,这样整个飞行过程就不会那么累。
输入描述
第一行1个整数N表示树的个数(2 <= N <= 10^6);
第二行N个整数分别表示第i棵树的高度D[i];
第三行1个整数Q(1 <= Q <= 25)表示K的个数;
接下来Q行,每行1个整数表示K。
输出描述
输出Q行,每行1个整数表示家雀儿在此K情况下最小化的劳累值。
样例
输入
9 4 6 3 6 3 7 2 6 5 2 2 5
输出
2 1
提示
K=2时
家雀儿可以从第一棵树向右飞停在第三、五、七、八、九号树上,它的疲劳值是从第三棵树到第五棵树,从第七树到第八树的飞行过程中积累的,也可以停在第三、五、七、九号树上。
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],q,k,min_max,max;
int main(){
cin>>n ;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>q;
while(q--){
cin>>k;
int pre=1, sum=0;
while(pre+k<n){
int hmax=-1,t=pre,ma=-1,t1=pre;
for(int i=pre+1;i<=pre+k;i++){
if(a[i]<a[pre]){
if(hmax<a[i]) {
hmax=a[i];
t=i;
}
}
if(a[i]>=ma){
ma=a[i];
t1=i;
}
}
if(hmax==-1){
sum++;
pre=t1;
}
else pre=t;
}
if(a[pre]<=a[n]) sum++;
cout<<sum<<"\n";
}
return 0;
}
160

被折叠的 条评论
为什么被折叠?



