题意:有n个点,求以这n个点中的某一点为起点,到各点的曼哈顿距离和最小是多少

分析:

暴力枚举又要超时,这种题一般都是考思维了,多半都是用技巧找到一个高效的方法。个人觉得这题跟上一篇文章的题是一个类型。这种思想要记住。

这题也是用“分治”,虽说题目要求的是曼哈顿距离,但是我们为什么真的就要一步到位的求呢,可以横纵坐标分开求,先x排序,然后遍历一遍,求出横坐标的距离,然后y排序,遍历一遍求出坐标的距离加在刚才求得的x的距离上,就是曼哈顿距离了。

这里有一个非常巧妙但是其实很显而易见的东西:假定现在我们已经按x排好序了分别是ABC三个点,那么C到AB的距离和是|C-A|+|C-B|,又因为已经排序了,那么绝对值可以去掉,得(C-A)+(C-B),那么就是2*C-(A+B),也就是说一个点到它前面的点的距离的和等于它前面的点的个数乘以它的自己再减去前面所有点的和,到这里你是不是想到求一个数列的和的时候我们遍历一遍数列就得到了,通过这个方法我们用O(n)就得到了一个点到它前面的点的距离和,然后再倒着遍历一遍数列用相似的思想把它到它后面的点的距离再加上就行了。

还有一种也是分开x,y排序求和,不过可以这么做:先直接求出最前面的点到所有点的距离,然后依次遍历数列,通过后面一个点跟前面一个点的关系,找出差值相减,就是了。不明白的话仔细想想或者画图看看。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#define INF 1000000000000007
using namespace std;
struct node{long long x,y;long long sum;
}a[100005];
bool cmp1(node a,node b)
{return a.x<b.x;
}
bool cmp2(node a,node b)
{return a.y<b.y;
}
int main(){int t,n;cin>>t;while(t--){cin>>n;long long ans=INF;memset(a,0,sizeof(0));for(int i=0;i<n;i++)  cin>>a[i].x>>a[i].y;sort(a,a+n,cmp1);long long sum=0;for(int i=0;i<n;i++){a[i].sum=i*a[i].x-sum;sum+=a[i].x;}sum=0;for(int i=n-1;i>=0;i--){a[i].sum+=sum-(n-1-i)*a[i].x;sum+=a[i].x;}sort(a,a+n,cmp2);sum=0;for(int i=0;i<n;i++){a[i].sum+=i*a[i].y-sum;sum+=a[i].y;}sum=0;for(int i=n-1;i>=0;i--){a[i].sum+=sum-(n-1-i)*a[i].y;          sum+=a[i].y;ans=min(ans,a[i].sum);}cout<<ans<<endl;}
}

!HDU 4311 最小曼哈顿距离-思维卡时间-(横纵坐标分开算,排序)相关推荐

  1. 天使玩偶(CDQ分治+最小曼哈顿距离)

    天使玩偶 题意:有两种操作: 给二维平面上加入一个点 询问二维平面上到某个点最近的一个点(用曼哈顿距离来表示) 思路:标准的CDQ分治,离线处理两种操作 当想到CDQ分治后本题的重点在于如何处理曼哈顿 ...

  2. 曼哈顿距离与切比雪夫距离的互化

    \(\\\) 曼哈顿距离 对于两个点\((x_1,y_1),(x_2,y_2)\),定义他们的曼哈顿距离为\(|x_1-x_2|+|y_1-y_2|\),即两坐标轴分别讨论差值再求和. 对于曼哈顿距离 ...

  3. 曼哈顿距离与切比雪夫距离及其相互转化

    文章目录 曼哈顿距离与切比雪夫距离及其相互转化 1.算法分析 1.1 曼哈顿距离 1.2 切比雪夫距离 1.3 两者之间的关系 1.4 用处 2.典型例题 曼哈顿距离与切比雪夫距离及其相互转化 1.算 ...

  4. 【51nod - 1108】距离之和最小 V2(曼哈顿距离,中位数性质)

    题干: 三维空间上有N个点, 求一个点使它到这N个点的曼哈顿距离之和最小,输出这个最小的距离之和. 点(x1,y1,z1)到(x2,y2,z2)的曼哈顿距离就是|x1-x2| + |y1-y2| + ...

  5. 51nod 1213 二维曼哈顿距离最小生成树

    1213 二维曼哈顿距离最小生成树 基准时间限制:4 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 二维平面上有N个坐标为整数的点,点x1 y1同点x2 y2之间 ...

  6. 曼哈顿距离最小生成树

    一.参考博客 博客:曼哈顿距离最小生成树与莫队算法 博客:学习总结:最小曼哈顿距离生成树 二.前置知识 1.曼哈顿距离:给定二维平面上的N个点,在两点之间连边的代价.(即distance(P1,P2) ...

  7. 最近/最远曼哈顿距离

    本文都是以二维举例的,实际上变成更多维也是差不多的情况啦,只是每个点的状态多了一些而已. 最远曼哈顿距离: 假设有两个点A(xi,yi),B(xj,yj) 则两点之间的曼哈顿距离为 |xi-xj|+| ...

  8. HDU 4311 - Meeting point-1(前缀和优化曼哈顿距离)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4311 题意:给定n个点,找出一点使得该点到其余各点的曼哈顿距离总和最小,输出最小值. 思路:分别对横纵 ...

  9. 专题训练二 搜索进阶 HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离)

    HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离) Problem Description Last night, little erriyue had a horrible ...

  10. [leetcode]1131. 绝对值表达式的最大值 ---曼哈顿距离,四角思维

    解题思路 参考这个帖子写的,下面的图片也截自这里 https://leetcode.com/problems/maximum-of-absolute-value-expression/discuss/ ...

最新文章

  1. linux工作常用软件
  2. 【求解】未定义的析构函数
  3. java中方法不调用会执行_java[新手]类里的方法没有调用为什么实现了?
  4. 考研【研究所和高校的区别、全国375所独立于高校系统之外的 “研究生所”】
  5. 第三次学JAVA再学不好就吃翔(part79)--并发修改异常产生的原因及解决方案
  6. arm-linux-gcc:Command not found的问题
  7. 报错Unable to resolve target android-5
  8. 设计模式学习笔记——组合(Composite)模式
  9. nodejs计算时间间隔_nodejs 如何定时执行一个函数
  10. 质疑北京大北农科技集团股份有限公司(”大北农“)停牌公告
  11. HTML 中Doctype简单解析
  12. C++ string 的学习摘录
  13. python管理系统web版_Python从零搭建Conf_Web配置管理平台
  14. 安装程序无法创建新的系统分区 服务器,安装程序无法创建新的系统分区怎么办...
  15. js科学计算机,js网页在线科学计算器代码
  16. Windows锁机病毒
  17. Prometheus简介和安装
  18. java memorystream 包_C#使用MemoryStream类读写内存
  19. 百度首次元宇宙里开大会,李彦宏:智能交通将使5年内一线城市不再限购限行...
  20. S9306 VR002 配置acl

热门文章

  1. 03-ES6语法:模板字面量(Template Literals)
  2. 计算机网络技术文档心得,计算机网络技术学习心得体会.docx
  3. OSChina 周三乱弹 —— who's your 大爷
  4. 阿里云DDNS+iKuai 软路由+证书安装
  5. 【Linux】常用配置文件路径
  6. scikit-learn 机器学习:sklearn.neighbors 的k近邻算法使用
  7. DSP之定时器理论笔记
  8. DSP_TMS320F28377D_eCAP学习笔记
  9. Gitlab服务器 forbidden
  10. OSChina 周二乱弹 —— 代码中的坑是怎么出现的?