【算法设计与分析】贪心策略——最佳邮局设置问题

原创 2018年04月16日 21:49:42

//总是感觉生活很空虚,就只能写写博客看看书上上课这样子。想出去,去一个遥远的地方。

先来看一下题目:

有n户人家坐落在从西向东的一条街上。从街西头向东数,第i户的房子与街西头的距离是H[i]米,(1≤i≤n), H[1]< H[2] < H[3] … < H[n] ,假设街上没有邮局。现在,要在街上建一些邮局使得任一户人家到最近一个邮局的距离不超过1000米。请设计一个O(n)时间的算法以确定最少需要见的邮局收,并给出每个邮局到街西头的距离。

看到这道算法题,我有点羡慕这条街的人,寄信肯定超级方便,但也不禁有疑问,这个年代还要不要设置这么多邮局,因为不知道是不是还有很多人在写信,但是我特想写封信寄给她。蓦然想起来那首《从前慢》,"从前的日色变得慢/车,马,邮件都慢/一生只够爱一个人"。

正所谓一步一个脚印,既然要建邮局,还是那么多邮局,我们必然要从第一个邮局建起,邮局我们就假设为一个P数组,int型,里面存储邮局距离街最西头王大姐家菜地的距离。那么,第一个邮局便是P[1],回顾一下题目,我们需要确定最少的邮局数量,也就是说我们要让邮局的存在效用最大化,即每个邮局的覆盖范围最广,那么对P[1]来讲,必然是P[1]设立在H[1]+1000处时最为合适,附图来说:



从图里面可以看出,P[1]设立在H[1]+1000处时覆盖范围最广,在此点的右边设立,不符合题意,第一户人家距离邮局太远,若在左边,那么范围不够大,会多出第一户人家到菜地的一些距离,这个距离对邮局设立来说意义不大。将第一个邮局设立之后,应当考虑P[2],P[3]...假若H[2]等一些户人家在段1或者段2之中,那么我们便无需再对这些人家考虑单独设立邮局,直到距离P[1]+1000点最近且在此点东边的下一户人家重新开始考虑设立P[2],方法与H[1]和P[1]相同,以此类推到P[n]。

这里要注意的是,按照算法,最后一户人家如果距离其左边的邮局距离大于千米,那么在其右边千米处会设立一个邮局,也就是在街的最东头设立了一个邮局,这就有点尴尬了,专门为最后一户人家设立的还距离那么远。因此我们将此邮局设立在最后一户人家附近即可。

下面给出代码:

#include<stdio.h>
#define MAX 101
int Post_office(int P[],int H[],int n){
    P[1]=H[1]+1000;  //第一个邮局位置
	int m=1;
	int i;
	for(i=2;i<=n;i++){
        if(H[i]>P[m]+1000){
            m++;
			P[m]=H[i]+1000;
		}
	}
	if(P[m]>H[n])
	    P[m]=H[n];  //最后一个邮局不需要在最后一户人家之外

	return m;
}
int main(){
    int P[MAX];
	int H[MAX];
	int n=0;
	int m=0;
	printf("Please input the quantity:\n");
	scanf("%d",&n);
	printf("Please input the family`s distance:\n");
	for(int i=1;i<=n;i++){
        scanf("%d",&H[i]);
	}
	m=Post_office(P,H,n);
    printf("There are %d post office,there are:\n",m);
	for(int i=1;i<=m;i++){
	    printf("%d ",P[i]);
	}
	return 0; 
}


C++Builder的几则小应用

这是第一篇帖文,从网上找的。以下是原文。C++Builder的几则小应用(望月 2001年09月19日 19:00)Borland C++BUILDER(BCB)是一种面向对象的、可视化的快速应用程序...
  • lwd2k
  • lwd2k
  • 2001-10-17 22:34:00
  • 882

邮局选址问题

描述 在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。街区中任意2 点(x1,y...
  • a997930294
  • a997930294
  • 2013-08-18 11:18:36
  • 3019

贪心算法--邮局选址,输油管道问题

描述 在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。街区中任意2 点(...
  • Randyhe_
  • Randyhe_
  • 2017-11-27 15:42:50
  • 184

邮局选址问题

#include "iostream" #include "algorithm" #include "fstream" using namespace std;//数组a[low,heigh]中,将小...
  • u012319493
  • u012319493
  • 2015-11-16 16:23:13
  • 530

【算法设计与分析】贪心策略——最佳邮局设置问题

//总是感觉生活很空虚,就只能写写博客看看书上上课这样子。想出去,去一个遥远的地方。先来看一下题目:有n户人家坐落在从西向东的一条街上。从街西头向东数,第i户的房子与街西头的距离是H[i]米,(1≤i...
  • Lone_rain
  • Lone_rain
  • 2018-04-16 21:49:42
  • 28

<em>贪心</em>法求TSP<em>问题</em>

<em>贪心</em>法求TSP问题 2013-05-21 上传大小:121KB TSP问题 题目描述:TSP(Traveling...<em>算法</em>小作业 <em>邮局选址问题</em> 立即下载 上传者: lilanxiao 时间: 2011-06-16 综合...
  • 2018年04月18日 00:00

<em>算法</em>设计与实验题解

<em>问题算法</em>实现题2-3 <em>邮局选址问题</em>算法实现题2-4 马的Hamilton周游路线<em>问题算法</em>...<em>贪心算法</em>算法实现题4-1 会场安排<em>问题算法</em>实现题4-2 最优合并<em>问题算法</em>实现题4-...
  • 2018年04月18日 00:00

<em>算法</em>设计与实验题解(pdf)

(习题2-31)算法实现题2-3 <em>邮局选址问题</em>(习题2-32)算法实现题2-4 马的Hamilton...第4章 <em>贪心算法</em>第5章 回溯法第6章 分支限界法第7章 概率算法第8章 线性...
  • 2018年04月17日 00:00

最少硬币问题--贪心算法

设有n种...
  • lyflower
  • lyflower
  • 2008-03-05 14:46:00
  • 11968

贪心算法--畜栏保留问题(poj3190 )

ps:在poj上c++编译能过,g++不能过; #include #include using namespace std; #define NUM 50005 struct cow{ ...
  • Randyhe_
  • Randyhe_
  • 2017-11-27 15:09:48
  • 376
收藏助手
不良信息举报
您举报文章:【算法设计与分析】贪心策略——最佳邮局设置问题
举报原因:
原因补充:

(最多只允许输入30个字)