我正试图解决这个问题:
当
在大学做实习课程时,他曾经不得不测量一种慢慢接近平衡的效应的强度。确定平衡强度的一个好方法是选择数量足够多的尽可能稳定的连续数据点,并取其平均值。当然,有了通常大小的数据,这并没有什么挑战性--但是为什么不在我们进行类似的编程竞赛时提出一个类似的问题呢?
您将得到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++语法,我理解正在发生的事情。我只是不明白为什么这个算法有效。
#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;
}
有人能给我解释一下吗?
发布于 2019-11-05 12:09:55
数组a
代表值x
的最后一个位置。
现在,让我们计算每个位置的左界(值为x
),如果a[x - 1]
比a[x + 1]
更接近a[x]
,这意味着将打破几乎常量规则的位置位于a[x + 1]
(因为中间有x - 1
)或a[x - 2]
(因为中间有x - 1
)。
反之亦然。
https://stackoverflow.com/questions/58716986
复制相似问题