zoukankan      html  css  js  c++  java
  • cf602B Approximating a Constant Range

    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.

    Examples
    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].

    我有点惊讶。。B题就考dp了,虽然是简单的dp

    题意是说给一个序列,保证相邻两项差值不超过1,求一个最长子串长度,要求满足子串中最大值减最小值小于2

    意思就是串中只能有相邻的两个数字咯

    令f[i][1]表示以第i个数开头,只包含a[i]和a[i]+1两种数字的最长子串

    令f[i][2]表示以第i个数开头,只包含a[i]和a[i]-1两种数字的最长子串

    然后

    a[i]==a[i+1] 则 f[i][1]=f[i+1][1] f[i][2]=f[i+1][2]

    a[i]==a[i+1]+1 则 f[i][1]=1 f[i][2]=f[i+1][1]+1

    a[i]==a[i+1]-1 则  f[i][2]=1 f[i][1]=f[i+1][2]+1

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<algorithm>
     6 #include<cmath>
     7 #include<queue>
     8 #include<deque>
     9 #include<set>
    10 #include<map>
    11 #include<ctime>
    12 #define LL long long
    13 #define inf 0x7ffffff
    14 #define pa pair<int,int>
    15 #define pi 3.1415926535897932384626433832795028841971
    16 using namespace std;
    17 inline LL read()
    18 {
    19     LL x=0,f=1;char ch=getchar();
    20     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    21     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    22     return x*f;
    23 }
    24 inline void write(LL a)
    25 {
    26     if (a<0){printf("-");a=-a;}
    27     if (a>=10)write(a/10);
    28     putchar(a%10+'0');
    29 }
    30 inline void writeln(LL a){write(a);printf("
    ");}
    31 int n,ans;
    32 int a[100010];
    33 int s1[100010];
    34 int s2[100010];
    35 int main()
    36 {
    37     n=read();
    38     for (int i=1;i<=n;i++)a[i]=read();
    39     s1[n]=s2[n]=ans=1;
    40     for (int i=n-1;i>=1;i--)
    41     {
    42         if (a[i]==a[i+1])s1[i]=s1[i+1]+1,s2[i]=s2[i+1]+1;
    43         if (a[i]>a[i+1])s1[i]=1,s2[i]=s1[i+1]+1;
    44         if (a[i]<a[i+1])s2[i]=1,s1[i]=s2[i+1]+1;
    45         ans=max(ans,max(s1[i],s2[i]));
    46     }
    47     printf("%d
    ",ans);
    48 }
    cf602B
    ——by zhber,转载请注明来源
  • 相关阅读:
    HTML5新增标签和属性
    HTML——表单标签
    HTML——表格标签
    js
    js
    js
    js
    js-02-2
    js
    selleck --手机端-- 销售打卡记录下载
  • 原文地址:https://www.cnblogs.com/zhber/p/5745935.html
Copyright © 2011-2022 走看看