游游得到了一个有 个数字的数列。 游游定义了 “平滑值”的概念:平滑值指任意两个相邻的数的差的绝对值的最大值。例如[1,2,5,7,8]的平滑值是3。 游游现在想知道,在只修改一个位置的数字(可以修改为任意值)或者不修改的情况下,数列的平滑值最小是多少?
区块链毕设网qklbishe.com为您提供问题的解答
#include <algorithm>
#include <map>
using namespace std;
const int N = 2e5 + 10, inf = 2e9 + 10;
int n;
int a[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
map<int, int> hash;
for (int i = 1; i < n; i ++ ) hash[abs(a[i] – a[i + 1])] ++;
int ans = inf;
for (int i = 1; i <= n; i ++ )
{
if (i == 1 || i == n)
{
int t;
if (i == 1) t = abs(a[i] – a[i + 1]);
else t = abs(a[i] – a[i – 1]);
hash[t] –;
if (hash[t] == 0) hash.erase(t);
hash[0] ++;
ans = min(ans, hash.rbegin()->first);
hash[t] ++;
hash[0] –;
if (hash[0] == 0) hash.erase(0);
}
else {
int d1 = abs(a[i] – a[i – 1]), d2 = abs(a[i] – a[i + 1]);
hash[d1] –;
hash[d2] –;
if (hash[d1] == 0) hash.erase(d1);
if (hash[d2] == 0) hash.erase(d2);
int t = (a[i – 1] + a[i + 1]) / 2;
int t1 = abs(t – a[i – 1]), t2 = abs(t – a[i + 1]);
hash[t1] ++;
hash[t2] ++;
ans = min(ans, hash.rbegin()->first);
hash[d1] ++;
hash[d2] ++;
hash[t1] –;
hash[t2] –;
if (hash[t1] == 0) hash.erase(t1);
if (hash[t2] == 0) hash.erase(t2);
}
}
cout << ans << endl;
return 0;
}
以上就是关于问题游游得到了一个有 个数字的数列。 游游定义了 “平滑值”的概念:平滑值指任意两个相邻的数的差的绝对值的最大值。例如[1,2,5,7,8]的平滑值是3。 游游现在想知道,在只修改一个位置的数字(可以修改为任意值)或者不修改的情况下,数列的平滑值最小是多少?的答案
欢迎关注区块链毕设网-
专业区块链毕业设计成品源码,定制。
区块链NFT链游项目方科学家脚本开发培训