首页 > 试题广场 >

最大 FST 距离

[编程题]最大 FST 距离
  • 热度指数:8089 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
\hspace{15pt}给定 n 个元素,第 i 个元素具有特征值 A_i。定义FST 距离如下:

\mathrm{dist}(i,j)=\lvert i^2-j^2\rvert+\lvert A_i^2-A_j^2\rvert

\hspace{15pt}请计算 A_i 中所有元素对儿中的最大 FST 距离。

输入描述:
\hspace{15pt}第一行输入一个整数 n\left(1\leqq n\leqq 10^5\right)
\hspace{15pt}第二行输入 n 个整数 A_1,A_2,\dots,A_n\left(1\leqq A_i\leqq 10^9\right)


输出描述:
\hspace{15pt}输出一个整数,表示最大距离。
示例1

输入

2
4 3

输出

10

说明

|4^2-3^2|+|2^2-1^2| = 7+3 = 10

备注:

# 方法一:暴力解法,但超时
n = int(input())
num_list = list(map(int, input().split()))

max_FST = 0
for i in range(n):    # 任意两点循环计算,将最大值通过max()选出
    for j in range(n):
        max_FST = max(max_FST, abs((i+1)**2-(j+1)**2)+abs(num_list[i]**2-num_list[j]**2))

print(max_FST)

# 方法二:设i^2为Xi,设Ai^2为Yi,则原式可化为dist=|(Xi-Xj)|+|(Yi-Yj)|
# 若(Xi, Yi)是坐标点,则我们要求两点的横纵坐标之差的绝对值的和
# 将绝对值展开得到四个式子
# 1:(Xi±Yi)-(Xj±Yj)  
# 2:(-Xi±Yi)-(-Xj±Yj)    观察可知,第二组式子可由第一组式子的基础上添加负号得来
# 故选择第一组式子,1:(Xi+Yi)-(Xj+Yj)    2:(Xi-Yi)-(Xj-Yj)
# 而上述两个式子中只出现了两种元素:Xi+Yi和Xi-Yi
# 故只需求出两者各自的max和min,相减取最大值即可
n = int(input())
num_list = list(map(int, input().split()))

jia_list = []
jian_list = []
for i in range(n):    # 存入x+y和x-y的所有值
    x = (i + 1) ** 2
    y = num_list[i] ** 2
    jia_list.append(x + y)
    jian_list.append(x - y)

# 根据两个式子计算一个最大的
max_FST = max(max(jia_list) - min(jia_list), max(jian_list) - min(jian_list))
print(max_FST)
发表于 2026-02-15 18:21:08 回复(0)

问题信息

上传者:牛客301599号
难度:
1条回答 3255浏览

热门推荐

通过挑战的用户

查看代码
最大 FST 距离