1. 程式人生 > 其它 >NC:Distance(類曼哈頓和歐幾里德距離)

NC:Distance(類曼哈頓和歐幾里德距離)

技術標籤:數學數學

題目描述


FST 作為小朋友,經常會遇到和距離有關的問題,但是他已經厭倦了曼哈頓距離和歐幾里德距離,所以 FST 就定義了一種 FST 距離。
這種距離並不用於空間或平面中,而運用於 FST 發明的一些神奇的演算法中(唔… …)。
設 i 號元素的特徵值為 A i ,則 i 和 j 的 FST 距離是
D i s t a n c e ( F S T ) = ∣ i 2 − j 2 ∣ + ∣ A i 2 − A j 2 ∣ Distance(FST) = | i^2 - j^2 | + |A_i^2 - A_j^2| Distance(FST)=i2j2+

Ai2Aj2

為了實現某新的資料結構,FST想在一大堆元素中找出距離最大的一對元素,他不關心是哪一對元素,只想求出最大距離
NC:Distance

輸入描述:
第一行,一個正整數 n,為元素個數。
第二行,n 個正整數 A i 為這 n 個元素的特徵值。
輸出描述:
一行,一個正整數表示最大距離。long long 請用 lld

題目分析


題解:與曼哈頓距離本質一樣,將其去掉絕對值可有四種情況
i 2 − j 2 + A i 2 − A j 2 ( 1 ) j 2 − i 2 + A i 2 − A j 2 ( 2 ) i 2 − j 2 + A j 2 − A i 2 ( 3 ) j 2 − i 2 + A j 2 − A i 2 ( 4 ) \begin{array}{l} i^2 - j^2 + A_i^2 - A_j^2&&(1)\\ j^2 - i^2 + A_i^2 - A_j^2&&(2)\\ i^2 - j^2 + A_j^2 - A_i^2&&(3)\\ j^2 - i^2 + A_j^2 - A_i^2&&(4)\\ \end{array}

i2j2+Ai2Aj2j2i2+Ai2Aj2i2j2+Aj2Ai2j2i2+Aj2Ai2(1)(2)(3)(4)

由(3)合併同類項有:
i 2 − A i 2 + A j 2 − j 2 ( 5 ) \begin{array}{l} i^2 - A_i^2 + A_j^2 - j^2 && (5) \end{array} i2Ai2+Aj2j2(5)(5)可理解為點 ( i , A i) 和點 ( j , A j ) 與原點的關係 。
而將四種情況的點 ( i , A i) 提取只有兩種情況即: A i 2 − i 2 o r A i 2 + i 2 A_i^2 - i^2 or A_i^2 + i^2

Ai2i2orAi2+i2因此,我們只需要考慮,遍歷陣列的同時計算每個點距離原點 A i 2 − i 2 和 A i 2 + i 2 的 值 A_i^2 - i^2 和 A_i^2 + i^2的值 Ai2i2Ai2+i2並存儲在兩個陣列中 arr_a 和 arr_b ,然後對其分別排序,最終的最大距離: m a x D i s t a n c e = m a x ( a r r a [ n − 1 ] − a r r a [ 0 ] , a r r b [ n − 1 ] − a r r b [ 0 ] ) maxDistance = max ( arr_a[n-1] - arr_a[0] , arr_b[n-1] - arr_b[0] ) maxDistance=max(arra[n1]arra[0],arrb[n1]arrb[0])

AC程式碼:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
 
typedef long long ll;
const int maxn = 100000 + 5;
ll a[maxn],b[maxn];
 
int main(){
    int n;
    ll x;
    while(scanf("%d",&n)!=EOF){
        for(int i = 1; i <= n; i ++){
            scanf("%lld",&x);
            a[i] = x * x + 1LL * i * i;
            b[i] = x * x - 1LL * i * i;
        }
        sort(a + 1,a + n + 1);
        sort(b + 1,b + n + 1);
        ll maxx = max(b[n] - b[1],a[n] - a[1]);
        printf("%lld\n",maxx);
    }
    return 0;
}