愤怒的家雀子

题目描述

在森林里有一排树。第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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值