首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >算法:最长近似间隔

算法:最长近似间隔
EN

Stack Overflow用户
提问于 2019-11-05 17:58:51
回答 1查看 248关注 0票数 2

我正试图解决这个问题:

在大学做实习课程时,他曾经不得不测量一种慢慢接近平衡的效应的强度。确定平衡强度的一个好方法是选择数量足够多的尽可能稳定的连续数据点,并取其平均值。当然,有了通常大小的数据,这并没有什么挑战性--但是为什么不在我们进行类似的编程竞赛时提出一个类似的问题呢?

您将得到n个数据点的序列( a1, ..., an)。连续数据点之间不会有任何大的跳跃--对于每个1 ≤ i < n,都可以保证\ai + 1 - ai\ ≤ 1。

如果数据点的最大值和最小值之间的差值最多为1时,则称数据点的范围l, r几乎为常数。形式上,设M是l ≤ i ≤ r的ai的最大值和最小值;如果M - m ≤ 1,则范围l、 r几乎是常数。

找出最长的几乎恒定范围的长度。

输入输入的第一行包含一个整数n (2 ≤ n ≤ 100 000) --数据点的数目。

第二行包含n个整数a1、 a2、 ..., an (1 ≤ ai ≤ 100 000)。

输出一个数字--给定序列的几乎恒定范围的最大长度。

https://codeforces.com/problemset/problem/602/B

我在这里看到了一个解决方案,但我不理解算法,特别是循环的主体。我熟悉C++语法,我理解正在发生的事情。我只是不明白为什么这个算法有效。

代码语言:javascript
代码运行次数:0
运行
复制
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000005];
int main()
{
int n,ans = 2,x;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{

    scanf("%d",&x);
    a[x] = i;
    if(a[x-1] > a[x+1])
        ans = max(ans,i-max(a[x+1],a[x-2]));
    else
        ans = max(ans,i-max(a[x+2],a[x-1]));
}
printf("%d\n",ans);
return 0;
}

有人能给我解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-05 20:09:55

数组a代表值x的最后一个位置。

现在,让我们计算每个位置的左界(值为x),如果a[x - 1]a[x + 1]更接近a[x],这意味着将打破几乎常量规则的位置位于a[x + 1](因为中间有x - 1 )或a[x - 2](因为中间有x - 1 )。

反之亦然。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58716986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档