問題 f: [tjoi 2013]松鼠聚會
時間限制: 1 sec 記憶體限制: 128 mb
提交: 70 解決: 35
[提交][狀態][討論版]
題目描述
有n個小松鼠,它們的家用乙個點x,y表示,兩個點的距離定義為:點(x,y)和它周圍的8個點即上下左右四個點和對角的四個點,距離為1。現在n個松鼠要走到乙個松鼠家去,求走過的最短距離。
輸入 第一行給出數字n,表示有多少只小松鼠。0<=n<=10^5
下面n行,每行給出x,y表示其家的座標。
-10^9<=x,y<=10^9
輸出 表示為了聚會走的路程和最小為多少。
樣例輸入
6 -4 -1
-1 -2
2 -4
0 2
0 3
5 -2
樣例輸出
20題目中要求的是切比雪夫距離,但這個太麻煩了。其實切比雪夫距離是可以轉化成曼哈頓距離的,切比雪夫距離公式:s=max(ax-bx,ay-by)等於(ax+ay,ax-ay)和(bx+by,bx-by)兩點的曼哈頓距離。想要證明只要把那個曼哈頓距離求出來化簡即可。
那麼就容易了,搞乙個字首和,二分出做減法的邊界,掃一遍就行了。
#include
#include
#include
#include
#include
#define n 100005
#define inf 1000000000
#define ll long long
struct nodea[n];
int n,mn=inf,mx=-inf,bx[n],by[n];ll ans=inf*10000000ll,sumx[n],sumy[n];
using namespace std;
int main()
sort(bx+1,bx+n+1);
sort(by+1,by+n+1);
for(int i=1;i<=n;i++)
sumx[i]=sumx[i-1]+bx[i],sumy[i]=sumy[i-1]+by[i];
for(int i=1;i<=n;i++)
TJOI2013 松鼠聚會
題目描述 草原上住著一群小松鼠,每個小松鼠都有乙個家。時間長了,大家覺得應該聚一聚。但是草原非常大,松鼠們都很頭疼應該在誰家聚會才最合理。每個小松鼠的家可以用乙個點x,y表示,兩個點的距離定義為點 x,y 和它周圍的8個點 x 1,y x 1,y x,y 1 x,y 1 x 1,y 1 x 1,y ...
TJOI2013 松鼠聚會(列舉)
草原上住著一群小松鼠,每個小松鼠都有乙個家。時間長了,大家覺得應該聚一聚。但是草原非常大,松鼠們都很頭疼應該在誰家聚會才最合理。每個小松鼠的家可以用乙個點x,y表示,兩個點的距離定義為點 x,y 和它周圍的8個點 x 1,y x 1,y x,y 1 x,y 1 x 1,y 1 x 1,y 1 x 1...
3170 Tjoi 2013 松鼠聚會
題目鏈結 題目大意 給定平面上的n個點,求這n個點中的乙個點,使其到這n個點的切比雪夫距離之和最小 題解 根據結論 把座標系旋轉45 曼哈頓距離轉化成切比雪夫距離,把點 x y 變成 x y,x y 這樣新點之間的切比雪夫距離就是原點之間的曼哈頓距離 同理可以把切比雪夫距離轉化成曼哈頓距離,把點 x...