题目传送门

题意:给一些坐标轴上的点,选一个点,使得其他点到该点曼哈顿距离和最小

分析:这题有很强的技巧性,直接计算每个点的曼哈顿距离和是不可行的。这里用到了前缀的思想,先对点按照x从左到右排序,p[i].sum保存选择i点时曼哈顿距离和是多少,p[i].sum = (i - 1) * p[i].x - sum (p1.x~pi-1.x) + sum (pi+1.x~pn.x) - (n - i) * p[i].x; ,i前面每个点的到i的x轴距离为:p[i].x - p[j].x,i后面每个点到i的x轴距离为:p[j].x - p[i].x,累计求和就是上式,y轴同理,可能配上图好理解:

那么每个点都计算出来了,只要在遍历一遍取最小值就是答案

收获:1. 前缀的使用技巧 2. 还有升级版的?

代码:

/************************************************
* Author :Running_Time
* Created Time :2015-8-24 13:21:56
* File Name :B_2.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const ll INFF = 1ll << 62;
const int MOD = 1e9 + 7;
struct Point {
ll x, y, sum;
}p[N];
int n; bool cmpx(Point a, Point b) {
return a.x < b.x;
} bool cmpy(Point a, Point b) {
return a.y < b.y;
} int main(void) {
int T; scanf ("%d", &T);
while (T--) {
scanf ("%d", &n);
for (int i=1; i<=n; ++i) {
scanf ("%I64d%I64d", &p[i].x, &p[i].y);
}
sort (p+1, p+1+n, cmpx); ll sum = 0;
for (int i=1; i<=n; ++i) {
p[i].sum = (i - 1) * p[i].x - sum;
sum += p[i].x;
}
sum = 0;
for (int i=n; i>=1; --i) {
p[i].sum += sum - (n - i) * p[i].x;
sum += p[i].x;
} sort (p+1, p+1+n, cmpy); sum = 0;
for (int i=1; i<=n; ++i) {
p[i].sum += (i - 1) * p[i].y - sum;
sum += p[i].y;
}
sum = 0;
for (int i=n; i>=1; --i) {
p[i].sum += sum - (n - i) * p[i].y;
sum += p[i].y;
} ll ans = INFF;
for (int i=1; i<=n; ++i) {
ans = min (ans, p[i].sum);
}
printf ("%I64d\n", ans);
} return 0;
}

  

最新文章

  1. 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)
  2. js判断是否安装pdf播放器
  3. 【WP8.1】富文本
  4. 最基本的session保存法,类似于默认的files方法
  5. 转:Bat命令学习
  6. 关于C# 中的Attribute 特性
  7. 基于C#的SolidWorks插件开发(1)--SolidWorks API接口介绍
  8. 多主一从mysql replication同步表的大胆尝试.
  9. ionic入门之色彩、图标和边距和界面组件:列表
  10. 【嵌入式linux】(第三步):安装串口终端 (ubuntu安装minicom串口终端)
  11. 【RL-TCPnet网络教程】第39章 RL-TCPnet之TFTP服务器
  12. 爬虫 解析库re,Beautifulsoup,
  13. mac系统如何处理来自身份不明的开发者
  14. tomcat免安装版做成windows系统服务
  15. MySQL数据类型2
  16. 数组去重的4种方法(Which one is the fastest???嘻嘻嘻....)
  17. js 如何移除一个匿名函数的绑定事件
  18. 使用vmware提示无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件
  19. python ---24 正则表达式 re模块
  20. 标准C库函数

热门文章

  1. redis connetced refused remote
  2. Linux中查看文件或者文件夹大小
  3. Tomcat和Jetty对WebSocket的支持
  4. Eclipse导入项目: No projects are found to import
  5. iOS 用xib自定义View
  6. oracle的日期蛋
  7. publish and submit
  8. 几种判断一个整数是否是2的n次方幂的方法
  9. ubuntu php5.6源码安装
  10. UWP开发入门系列笔记之(零):UWP的前世今生