[ 10.08 ]CF每日一題系列—— 602B

Description:
  一個數組,保證相鄰兩個元素值得差小於1,問題,最大值和最小值的差 < 1的區間長度最長是多少ios

Solution:
  仍是卡了一下,原本覺得是模擬就行了,可是卡時間,想來想去最後仍是忽略了一個地方,就是它的保證,相鄰元素值得差小於1,就保證了這個序列得變化是以1或0爲單位相鄰變化的,因此不可能出現5 4 6,因此咱們考慮一個數字x的時候只要去找出現的位置就好,咱們要找的可能區間有x 和 x + 1區間或者x 和 x - 1區間,因此咱們看一下上一個x - 1 出現的位置和x + 1 出現的位置在哪,由於他倆不能共存,若是x - 1出現的位置靠後,咱們要計算的就是 x和x-1區間的長度,要看 (x - 2)出現的位置和x + 1出現位置的最大值,爲其限制,反之亦然,用一個dp數組維護就行了數組

#include <iostream>
#include <cstdio>
#include <cstring>
#define inf ( 1 << 28 )
using namespace std;
const int maxn = 1e5 + 1e3;
int x;
int dp[maxn];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(dp,0,sizeof(dp));
        int ans = 0;
        for(int i = 1;i <= n;i++)
        {
            scanf("%d",&x);
            if(dp[x - 1] > dp[x + 1])ans = max(ans,i - max(dp[x + 1],dp[x - 2]));
            else ans = max(ans,i - max(dp[x+2],dp[x-1]));
            dp[x] = i;
        }
        printf("%d\n",ans);
    }
    return 0;
}
相關文章
相關標籤/搜索