zoukankan      html  css  js  c++  java
  • Codeforces Round #333 (Div. 2) B

    B. Approximating a Constant Range
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    When Xellos was doing a practice course in university, he once had to measure the intensity of an effect that slowly approached equilibrium. A good way to determine the equilibrium intensity would be choosing a sufficiently large number of consecutive data points that seems as constant as possible and taking their average. Of course, with the usual sizes of data, it's nothing challenging — but why not make a similar programming contest problem while we're at it?

    You're given a sequence of n data points a1, ..., an. There aren't any big jumps between consecutive data points — for each 1 ≤ i < n, it's guaranteed that |ai + 1 - ai| ≤ 1.

    A range [l, r] of data points is said to be almost constant if the difference between the largest and the smallest value in that range is at most 1. Formally, let M be the maximum and m the minimum value of ai for l ≤ i ≤ r; the range [l, r] is almost constant if M - m ≤ 1.

    Find the length of the longest almost constant range.

    Input

    The first line of the input contains a single integer n (2 ≤ n ≤ 100 000) — the number of data points.

    The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 100 000).

    Output

    Print a single number — the maximum length of an almost constant range of the given sequence.

    Sample test(s)
    Input
    5
    1 2 3 3 2
    Output
    4
    Input
    11
    5 4 5 5 6 7 8 8 8 7 6
    Output
    5
    Note

    In the first sample, the longest almost constant range is [2, 5]; its length (the number of data points in it) is 4.

    In the second sample, there are three almost constant ranges of length 4: [1, 4], [6, 9] and [7, 10]; the only almost constant range of the maximum length 5 is [6, 10].

    题意:求最大区间长度  区间要求满足:区间最大值与最小值的差小于等于1

    题解:

    例如

    5

    1 2 3 3 2

    差值分别为 2-1=1;

                   3-2=1;

                   3-3=0;

                   2-3=-1;  另外  it's guaranteed that |ai + 1 - ai| ≤ 1.

    可以判断 当连续的差值或相隔差值为0 的两个差值 相等时 该段区间结束 更新最大值

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,a;
    int main()
    {
        scanf("%d",&n);
        scanf("%d",&a);
        int cha=0;
        int judge=0;
        int l=0,r=0;
        int ans=0,exm;
        for(int i=1; i<n; i++)
        {
            scanf("%d",&exm);
            cha=exm-a;//计算差值
            a=exm;
            if(cha==0)//差值为零 相等时 
                continue;
            if(cha!=judge)//当前差值与 之前一个差值比较
            {
                judge=cha;//更新到当前区间
                r=i;
            }
            else
            {
                if(i-l>ans)//更新区间大小
                    ans=i-l;
                l=r;
                r=i;
            }
        }
        if(n-l>ans)//特列 后端 都相等
            ans=n-l;
        cout<<ans<<endl;
        return 0;
    }
    

      

  • 相关阅读:
    CS229 6.4 Neurons Networks Autoencoders and Sparsity
    CS229 6.3 Neurons Networks Gradient Checking
    【Leetcode】【Easy】Min Stack
    【Leetcode】【Easy】Merge Sorted Array
    【Leetcode】【Easy】ZigZag Conversion
    【Leetcode】【Easy】Valid Palindrome
    【Leetcode】【Easy】Reverse Integer
    【Leetcode】【Easy】Palindrome Number
    【Leetcode】【Easy】Length of Last Word
    【Leetcode】【Easy】Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/hsd-/p/5132113.html
Copyright © 2011-2022 走看看