HDU 6435 CSGO 求多維曼哈頓最遠距離

2022-07-15 23:15:14 字數 1633 閱讀 9256

題意:**有乙個能力值\(s_i\)和k個屬性值\(x_i\),要求從主**,副**兩個集合中各挑選一把使得評分最高。評分的指二者的s值之和,及二者各項屬性值的差的絕對值的和

分析:在做這道題前,可以先考慮poj 2926

求的是5維的n個點最遠點對的距離

我們先從只有一維的情況考慮起。只需要獲得該維的最大值,最小值,做差即可。

再考慮二維的情況,我們是否能夠化為乙個形式,使得無需考慮絕對值,直接用最大最小值做差呢

|x1-x2|+|y1-y2|, 必然為以下四者中的一種

(x1-y1)-(x2-y2) , (x1+y1)-(x2+y2), (-x1-y1)-(-x2-y2), (-x1+y1)-(-x2+y2)

注意到括號內形式相同,也就是說,對於二維的情況,我們分四種情況討論,分別求出最值,最後做差即可。

同理推廣到五維

在寫法上可利用數字表示狀態

#include #include #include using namespace std;

typedef long long ll;

const int maxn = 1e5 + 10;

const double inf = 1e12;

int n;

double a[maxn][5];

double ans, _min, _max;

int main()

} ans = 0;

for (int s = 0; s < (1 << 5); s++)

_min = min(_min, t);

_max = max(_max, t);

}ans = max(ans, _max - _min);

} printf("%.2lf\n", ans);

} return 0;

}

在考慮原題,考慮s應為相加的條件,我們如何利用已有結論呢?

顯然將主**的s取為負數即可, 那麼問題則變為k+1維。

同時為了保證求得的最遠點對分別屬於兩個集合,主**的s再減去乙個足夠大的數即可

#include #include #include using namespace std;

typedef long long ll;

int n, m, k;

const ll dep = 1e12;

const ll inf = 1e14;

const int maxn = 2e5 + 10;

ll wp[maxn][6];

ll ans, _min, _max;

int main()

wp[i][0] = -dep - wp[i][0];

} for (int i = 0; i < m; i++)

} ans = 0;

for (int s = 0; s < (1 << (k + 1)); s++)

_min = min(_min, t);

_max = max(_max, t);

}ans = max(ans, _max - _min);

} printf("%lld\n", ans - dep);

} return 0;

}

hdu 6435 CSGO 曼哈頓距離性質

你有n把主 m把副 現在你要各選一把。每把 有乙個基礎能力值和k各引數。你需要使你的兩把 的基礎值之和加各個能力值的絕對值之和最大。先只考慮能力值 如 a1 b1 a2 b2 a3 b3 約掉絕對值之後根據a1 a3和b1 b3的值,原式的每個數字的符號有2 3種可能性。但是只有一種符號分配的方式能...

hdu 求平均成績

假設乙個班有n n 50 個學生,每人考m m 5 門課,求每個學生的平均成績和每門課的平均成績,並輸出各科成績均大於等於平均成績的學生數量。input 輸入資料有多個測試例項,每個測試例項的第一行包括兩個整數n和m,分別表示學生數和課程數。然後是n行資料,每行包括m個整數 即 考試分數 outpu...

hdu 1394 求逆序數(線段樹求)

題意描述 給你乙個有0 n 1數字組成的序列,然後進行這樣的操作,每次將最前面乙個元素放到最後面去會得到乙個序列,那麼這樣就形成了n個序列,那麼每個序列都有乙個逆序數,找出其中最小的乙個輸出!解析 求出a1,a2,an 1,an的逆序數之後,就可以遞推求出其他序列的逆序數。假設要把a1移動到an之後...