题意:有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. LAMP环境搭建之rpm软件包
  2. Arrays数组工具类
  3. 使用字符串解析的方式完成计算器的设计思路
  4. oracle 添加默认值列,Oracle 11g增加列,并带默认值的新特性
  5. 基于逻辑回归算法模型搭建思路
  6. triz矛盾矩阵_TRIZ—创新性问题解决理论与实务培训
  7. WIN32API之常用进程、线程函数
  8. Linux tree 命令乱码
  9. OpenCV 直方图计算
  10. 差异表达基因变化倍数_重磅推出!欧易关键基因筛选报告
  11. NVIDIA Jetson TX2 更新软件源
  12. UINO优锘去ChinaJoy秀数字孪生元宇宙落地应用!
  13. 使用phpStudy显示3306端口被占用,该怎么办?
  14. Ansiable批量管理工具
  15. 前无古人,后无来者经典日志大汇总--------生活珍藏版(其实你并了解你所生活的世界!)
  16. Idea中git进行回滚版本操作和查看修改记录
  17. java 与数据库连接失败_java链接不上数据库,怎么解决!
  18. R语言入门基础——基础操作篇(极为基础的指令代码)
  19. OLAP和数据立方体
  20. 文字存入mysql数据库时出现Incorrect string value错误

热门文章

  1. 麦克劳林公式求sin(x)
  2. 怎么将EXCEL的网格线打印出来,教程在这里,EXCEL里的网格线如何打印出来
  3. 软件测试难不难?不是计算机专业也能学吗?
  4. java边界布局东南西北_第58节:Java中的图形界面编程-GUI
  5. 用html5画瀑布图,maftools | 从头开始绘制发表级oncoplot(瀑布图)
  6. SD-WAN,一场广域网的革命
  7. 华为笔试题--直角三角形周长
  8. andriod获取带字母的iccid
  9. word中方框中打钩
  10. 【找工作必读】来自IT公司速查手册的各大IT公司薪资