算法与数据结构实验题 4.4 干净的序列

★实验任务 有一个长度为 n 的序列,第 i 个的数为 a[i]。我们定义如果它的一个连续的 子串为“没有进行过干净的交易”,那么这个子串的最大值与最小值之差在[m,k] 中。 现在,你的任务是找到一条最长的“没有进行过干净的交易”的子串。
★数据输入
第一行输入三个正整数 n m k (0< n <=10000),m(0 =< m =< k =< n)。 接下去一行有 n 个正整数,第 i 个数表示 a[i]的值。
★数据输出
输出一个数,表示这个子串的长度。
输入示例
5 0 0
1 1 1 1 1
输出示例
5
输入示例
6 0 3
3 1 2 3 4 5
输出示例
5


/*
 * clean.cpp
 *
 *  Created on: 2016年9月30日 
 *      Author: 221500423 CJDM66
 */

#include<iostream>
#define NUM 10002
using namespace std;
int a[NUM]={NUM};
int main(void){
    int n,m,k,max,min,i,ii,count,ans=0;
    cin>>n>>m>>k;
    for(i=1;i<=n;i++){
        cin>>a[i];
    }
    for(i=1;i<=n;i++){
        count=0;
        min=a[i];
        max=a[i];
        for(ii=i-1;ii>=0;ii--){
            if(a[ii]<=max){
                count++;
                if(max-a[ii]>k){
                    count--;
                    break;
                } 
                if(a[ii]<min){
                    min=a[ii];
                }
            }
            else break;
        }
        for(ii=i+1;ii<=n;ii++){
            if(a[ii]<=max){
                count++;
                if(max-a[ii]>k){
                    count--;
                    break;
                } 
                if(a[ii]<min){
                    min=a[ii];
                }   
            }
            else break;
        }
        count++;
        if((max-min>=m)&&(max-min<=k)&&(ans<count)){
            ans=count;
        }
    }
    cout<<ans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cjdm66/article/details/52712201
4.4