BIT2014级软件学院程序设计-13 平面上的邮局
2016-03-02 15:47
218 查看
在一个平面上有n(1<=n<=100000)个村庄,每个村庄通过坐标(xi,yi)标示位置,-10^9<=xi,yi<=10^9。现在想要建一个邮局,使得到各个村庄的距离之和最短。
在这个问题中,距离定义为曼哈顿距离,即点i和点j的距离等于|xi-xj|+|yi-yj|
接下来n行每行有两个整数,表示一个村庄的坐标
0 0
10 10
0 10
对于超过int的数字,请用long long,输入和读取用%lld
行列不影响。直接求就行。
在这个问题中,距离定义为曼哈顿距离,即点i和点j的距离等于|xi-xj|+|yi-yj|
输入:
输入第一行为n,表示村庄的数量接下来n行每行有两个整数,表示一个村庄的坐标
输出:
输出一个数字,表示建立的邮局到各个村庄的和Sample Input:
30 0
10 10
0 10
Sample Output:
20提示:
村庄和邮局的坐标都一定为整数对于超过int的数字,请用long long,输入和读取用%lld
行列不影响。直接求就行。
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> int N; int x[100015],y[100015]; long long cal(int xx,int yy) { int i; long long ans1; ans1=0; for(i=0;i<N;i++) { ans1=ans1+(abs(xx-x[i])+abs(yy-y[i])); } return ans1; } int cmp(const void*a,const void*b) { return *(int*)a-*(int*)b; } int main() { int i; long long ans[10]; long long min_ans=10000000000000000; scanf("%d",&N); for(i=0;i<N;i++) { scanf("%d%d",&x[i],&y[i]); } qsort(x,N,sizeof(int),cmp); qsort(y,N,sizeof(int),cmp); ans[0]=cal(x[N/2],y[N/2]); ans[1]=cal(x[N/2-1],y[N/2]); ans[2]=cal(x[N/2],y[N/2-1]); ans[3]=cal(x[N/2-1],y[N/2-1]); for(i=0;i<=3;i++) { if(ans[i]<=min_ans) min_ans=ans[i]; } printf("%lld\n",min_ans); }
相关文章推荐
- Python脚本语言学习
- 关于4A网络安全管控平台控件加载失败的解决方法
- 获取本机IP地址(java)
- js实现checkbox的全选和反选
- ASP.NET MVC Html.ActionLink使用说明
- 自动挂载磁盘脚本
- iOS中属性的声明
- java小游戏第三弹 贪吃蛇
- 快速开发框架androidannotations
- CocoaPods安装和使用教程
- YARN环境中应用程序JAR包冲突问题的分析及解决
- 二叉树 非递归遍历
- 属性动画相关使用
- 淘宝架构演变三阶段简单总结
- iOS(学习) UITableView
- Android开发中实现多点触摸
- IIS发布asp.net项目,要做的准备工作及添加项目
- 【慕课笔记】第六章 JAVA中的集合框架(下) 第7节 Comparable&Comparator简介
- SAP BW提供的一些记录Query/process chain/DTP/IP运行及加载情况的InfoCube
- BIT2014级软件学院程序设计-12 编程珠玑