HDU4311 Meeting point-1(曼哈顿距离)

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4311

题意:

给定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 <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
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<B.x) return true;
    if(A.x==B.x&&A.y<B.y) return true;
    return false;
}

bool cmp2(point A,point B)
{
    if(A.y<B.y) return true;
    if(A.y==B.y&&A.y<B.y) return true;
    return false;
}

int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        LL sum=0;
        for(int i=1;i<=n;i++){
            scanf("%d%d",&p[i].x,&p[i].y);
            p[i].sum=0;
        }
        sort(p+1, p+1+n, cmp1);
        for (LL i = 1; i <= n; ++i) {
            p[i].sum += (i-1) * p[i].x - sum;
            sum += p[i].x;
        }
        sum = 0;
        for (LL i = n; i >= 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\n",ans);
    }
    return 0;
}



时间: 2024-10-10 08:29:55

HDU4311 Meeting point-1(曼哈顿距离)的相关文章

HDU 4311&amp;4312 Meeting point-1&amp;2 (曼哈顿距离&amp;&amp;切比雪夫距离)

HDU 4311 题意:平面上有n个点,一个点(x,y)只能到达(x-1,y), (x+1,y), (x, y-1), (x, y+1)4个点.从n个点中找到一点,使其他点到此点的距离之和最小. 思路: 可以发现,两个点间距离为 |x1-x2| + |y1-y2| ,这便是两点间的曼哈顿距离. 朴素的做法是遍历所有点,枚举该点与其他点间的曼哈顿距离之和,但是会TLE: 取巧的做法是将所有点与中心点的曼哈顿距离排序,枚举中间大概250个点左右的情况比较即可(不要欺负人家数据水! 正确姿势: 用结构

hdu4311 曼哈顿距离

http://acm.hdu.edu.cn/showproblem.php?pid=4311 Problem Description It has been ten years since TJU-ACM established. And in this year all the retired TJU-ACMers want to get together to celebrate the tenth anniversary. Because the retired TJU-ACMers ma

HDU4312 Meeting point-2 (切比雪夫距离&amp;&amp;曼哈顿距离)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4312 题意:给定平面坐标上n(n<=100000)个点,然后在其中选一个,使得所有点到当前点的Chebyshev距离和最小. 分析: 切比雪夫距离:设a(x1,y1),b(x2,y2);DIS = max(|x1-x2|,|y1-y2|) = (|x1-x2+y1-y2|+|x1-x2-y1+y2|)/2; 我们将点aa的坐标看成(x1+y1,x1-y1),bb的坐标看成(x2+y2,x2-y2)

【HDU 4311】Meeting point-1(前缀和求曼哈顿距离和)

题目链接 正经解法: 给定n个点的坐标,找一个点,到其他点的曼哈顿距离之和最小.n可以是100000.大概要一个O(nlogn)的算法.算欧几里得距离可以把x和y分开计算排好序后计算前缀和就可以在O(1)时间内判断一个点到其他点的距离. #include<cstdio> #include<algorithm> using namespace std; #define ll long long #define N 100005 int t,n; ll ans,sum[N],sx[N]

HDU 4311,4312 Meeting point(曼哈顿距离,切比雪夫距离)

 题意: 面上n个点,某点到其他点的曼哈顿距离最小和,切比雪夫距离最小和. 思路:对于切比雪夫距离可以转化为哈密顿距离,方法是将每个点的坐标逆时针旋转45度然后放大sqrt(2)倍,换成坐标表示也就是(x,y)->(x-y,x+y). 对于第一个问题,求曼哈顿距离最小和,也就是sum(xj-xi)+sum(yj-yi). 如果直接求时间复杂度无法承受. 所以我们可以先对x排序,对于从左到右的sum(x)我们可以递推出来,即sumx[tj[i].id] = sumx[tj[i-1].id] +

Hdu 4312-Meeting point-2 切比雪夫距离,曼哈顿距离,前缀和

题目: http://acm.hdu.edu.cn/showproblem.php?pid=4312 Meeting point-2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1231    Accepted Submission(s): 691 Problem Description It has been ten years s

Hdu 4311-Meeting point-1 曼哈顿距离,前缀和

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4311 Meeting point-1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3426    Accepted Submission(s): 1131 Problem Description It has been ten years s

BZOJ 2735: 世博会 主席树+切比雪夫距离转曼哈顿距离

2735: 世博会 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 51[Submit][Status][Discuss] Description 四年一度的世博会又要举办了,Q国很荣幸成为了这次世博会的主办方.Q国主席QQ从全国各地收集了N件物品排成 一排,作为Q国馆的展出物.对于相邻摆放的一些物品,如果过于相似会让人觉得无聊,如果差别过大又会让人觉 得突兀.为了让人们对这次世博会的展出满意,QQ需要知道一些相邻物品的“

一道曼哈顿距离的数学题

藏妹子之处(excel) 试题描述 今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格.但要满足如下的两个条件:(1)任意两个单元格都不在同一行.(2)任意两个单元格都不在同一列.选取格子存在一个花费,而这个花费是三个格子两两之间曼哈顿距离的和(如(x1,y1)和(x,y2)的曼哈顿距离为|x1-x2|+|y1-y2|).狗狗想知道的是,花费在minT到maxT之间的方案数有多少.答案模1000000007.所谓的