程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> HDU4311 Meeting point

HDU4311 Meeting point

編輯:關於C++

 

題意:

給定n個點,選其中的一個點作為起點,然後使其他點到這個點的曼哈頓距離最小,求這個最小的距離

 

分析:

我們設P作為這個點作為起點

然後 ans = sum(abs|pi.x-p.x|+|pi.y-p.y| )(1<=i<=n)

我們可以對其分別按x,y進行排序,就可以去掉絕對值符號

然後化簡後的公式就可以變成

設這個點在按x排完序後的位置為i;

設tot[i],表示到序號i為止的點的橫坐標的和。

ansx = (i-1)*p.x+(tot[n]-tot[i])-(n-i)*p.x

同理可以求出

設這個點在按t排完序後的位置為i;

ansy= (i-1)*p.y+(tot[n]-tot[i])-(n-i)*p.y

ans = ansx + ansy

然後取最小的ans 即可

時間復雜度為O(nlog(n));

 

代碼如下:

 

#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef long long LL;
const int maxn = 1e5+10;

struct point{
    int x,y;
    LL sum;
}p[maxn];

bool cmp1(point A,point B)
{
    if(A.x= 1; --i) {
            p[i].sum += sum - (n-i) * p[i].x;
            sum += p[i].x;
        }
        sum = 0;
        sort(p+1, p+1+n, cmp2);
        for (LL i = 1; i <= n; ++i) {
            p[i].sum += (i-1) * p[i].y -sum;
            sum += p[i].y;
        }
        sum = 0;
        LL ans = 1LL<<62;
        for (LL i = n; i >= 1; --i) {
            p[i].sum += sum - (n-i) * p[i].y;
            ans = min(ans, p[i].sum);
            sum += p[i].y;
        }
        printf(%I64d
,ans);
    }
    return 0;
}

 

??
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved