邮局选址问题
来源:互联网 发布:桥林中学的网络 编辑:程序博客网 时间:2024/06/10 23:06
问题描述:
在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
编程任务:
给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。
输入由多组测试数据组成。
每组测试数据输入的第1 行是居民点数n,1≤n≤10000。接下来n 行是居民点的位置,每行2 个整数x 和y,-10000≤x,y≤10000。
因为街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值 |x1-x2 |+ |y1-y2 |度量;
那么:
邮局的x坐标只与n个居民点的x坐标相关;
邮局的y 坐标只与n个居民点的y坐标相关;
以求x坐标为例
假设对n个居民点的x坐标按大小排序后为x1,x2......xn;
对x1,xn两点来说,最近的点肯定在x1,xn之间,且跟两点的距离和==xn-x1;
对x2,x(n-1)两点来说,最近的点肯定在x2,x(n-1)之间,且跟两点的距离和==x(n-1)-x2;
....
所以若n为奇数,则邮局的x坐标取最中间的值时最小;
所以若n为偶数,则邮局的x坐标可以取最中间两个值的之间的任意值;
最终公式:x=(x(n/2+1)+x(n/2+2)+...+xn)-(x1+x2+..+x(n/2))
最终公式:
s=(x(n/2+1)+x(n/2+2)+...+xn)-(x1+x2+..+x(n/2)) +(y(n/2+1)+y(n/2+2)+...+yn)-(y1+y2+..+y(n/2))
源代码
// 邮局选址.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAX_SIZE = 1000;
bool Cmp(int a, int b)
{
if(a < b)
return true;
else
return false;
}
int sum(int str[], int n)
{
int sum = 0,i,mid;
mid = str[n / 2];
for(i = 0; i < n; i++)
s += abs(str[i] - mid);
return s;
}
int main()
{
int x[MAX_SIZE],y[MAX_SIZE];
int i, n;
while(scanf("%d",&n) != EOF)
{
for(i = 0; i < n; i++)
scanf("%d%d",x + i, y + i);
sort(x ,x + n, Cmp);
sort(y, y + n, Cmp);
printf("%d\n",sum(x, n) + sum(y, n));
}
return 0;
}
- 邮局选址问题
- 邮局选址问题
- 邮局选址问题
- 邮局选址问题
- shu_1241 邮局选址问题
- 邮局选址问题
- 邮局选址问题
- 邮局选址问题
- 邮局选址问题
- 1156: 邮局选址问题
- 动态规划--邮局选址问题
- 动态规划--邮局选址问题
- 邮局选址问题(二)
- 【动态规划】邮局选址问题
- HZNUOJ 1804 邮局选址问题
- 其他题目---邮局选址问题
- 邮局选址问题 (第七题)
- 二维邮局选址问题-带权中位数
- [leetcode 189] Rotate Array
- 为Python安装easy_install工具
- Android View中onSave(),onRestore(),getWidth(),getMeasureWidth()方法解析
- VS2012其中的一个小BUG
- Docker核心技术
- 邮局选址问题
- JNI学习笔记
- iOS 计算某个时间到现在是多少月/天/时的代码
- Mac上OpenFire启动失败解决方案
- Google Chrome 浏览器 开发者工具 使用教程
- 有关 Python 2 和 Sublime Text 中文 Unicode 编码问题的分析与理解
- Sping+mybatis全注解模式下
- LRU算法学习
- Iterator和ListIterator