CF1270B Interesting Subarray 题解

22:20下晚自习所以只打了10+min,然而这并不能成为我脑抽没一眼看出B题的借口,所以又掉回绿名了qwq。所以我还是太菜了。

题意分析

给出一个数列,要求找出一段连续的子数列满足这个子数列的最大值与最小值之差不小于其元素个数。

思路分析

我们从最少的元素开始考虑。只有一个元素的子数列显然是不可行的,考虑含有两个元素的子数列。

可以发现,只要这两个元素的差不小于2即为可行,因此我们在输入的同时比较相邻的元素判断是否可行即可。

进一步分析可以发现,若整个数列都找不到满足上面这个条件的两个元素的子数列,则整个数列一定也不可行。因此按上面的方法判断即可。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int t,n;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        bool ok=0;
        for(int i=1,x1=-1,x2;i<=n;i++)
        {
            scanf("%d",&x2);
            if(abs(x1-x2)>1 && !ok && x1!=-1)
                printf("YES
%d %d
",i-1,i),ok=1;
            x1=x2;
        }
        if(!ok)
            puts("NO");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TEoS/p/12120667.html