首页 > 试题广场 >

最大 FST 距离

[编程题]最大 FST 距离
  • 热度指数:4524 时间限制: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

备注:

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();  // 消耗掉换行符
        String[] parts = sc.nextLine().split(" ");
        long[] A = new long[n];
        for (int i = 0; i < n; i++) {
            A[i] = Long.parseLong(parts[i]);
        }

        // 计算x = i² + A_i²的最大最小值
        long maxX = Long.MIN_VALUE;
        long minX = Long.MAX_VALUE;
        // 计算y = i² - A_i²的最大最小值
        long maxY = Long.MIN_VALUE;
        long minY = Long.MAX_VALUE;

        for (int i = 0; i < n; i++) {
            // 注意索引是从1开始的
            long index = i + 1;
            long indexSq = index * index;
            long aSq = A[i] * A[i];

            long x = indexSq + aSq;
            long y = indexSq - aSq;

            maxX = Math.max(maxX, x);
            minX = Math.min(minX, x);
            maxY = Math.max(maxY, y);
            minY = Math.min(minY, y);
        }

        // 最大距离是两个差值中的较大者
        long maxDist = Math.max(maxX - minX, maxY - minY);
        System.out.println(maxDist);
    }
}

发表于 2025-09-02 11:43:46 回复(0)