二维邮局选址问题-带权中位数

2023-10-26

算法设计练习作业,邮局选址问题,将自己写的分享,有问题请指正,希望共同学习。

关于邮局选址问题的理论知识就不赘述了,网上有讲解的。

#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;

/*
 *邮局选址问题,带权中位数
 *输入的坐标不能相同,即x或y各自是n个不同的数,该程序为不同的整型数
 *输入在文件input中,第一行为居民点个数,剩下行为(x,y,w)对,用空格分割
 *输出文件为output,包括邮局坐标,带权的最短距离和
 */

int partition(int a[],float w[],int p,int r);
int partition2(int a[],float w[],int p,int r,int z);
void quicksort(int a[],float w[],int p,int r);
int select(int a[],float w[],int p,int r,int k);
int cut(int a[],float w[],int p,int r,int z) ;

int t=0;//外部变量,保存上一次划分得到的下标
int main()
{
	fstream input,output;//输入输出流
	int count=0;//居民点个数
	int xk,yk;//所求的邮局坐标
	float sum=0.0;//带权最短距离和
	input.open("input_assign01_01.dat");
	if(!input)
	{
		cout<<"error:unable to open input file!"<<endl;
		return -1;
	}
	input>>count;

	int *ax=new int[count];
	int *ay=new int[count];//居民点x,y坐标数组
	float *awx=new float[count];//居民点权值数组,对应下标为同一居民点
	float *awy=new float[count];
	for(int i=0;i<count;i++)
	{
		input>>ax[i]>>ay[i]>>awx[i];
		awy[i]=awx[i];
	}
	
	xk=select(ax,awx,0,count-1,(count+1)/2);//计算xk,yk
	yk=select(ay,awy,0,count-1,(count+1)/2);


	for(i=0;i<count;i++)
	{
		
		sum+=awx[i]*abs(ax[i]-xk)+awy[i]*abs(ay[i]-yk);//求带权最短距离
	}

	output.open("output.txt");
	
	output<<"邮局的坐标为:"<<endl;
	output<<"("<<xk<<","<<yk<<")"<<endl;
	output<<"最短距离为:"<<endl;
	output<<sum;
	input.close();
	output.close();

	delete []ax;
	delete []ay;
	delete []awx;
	delete []awy;
	return 0;
}

/*
 *快速排序算法
 *a为带排序数组,w为其权值数组,p为开始下标,r为结束下标
 *功能是将a数组排序
 */
void quicksort(int a[],float w[],int p,int r)   
{
	if (p<r)
	{int q=partition(a,w,p,r);
	quicksort(a,w,p,q-1);
	quicksort(a,w,q+1,r);
	}
}
/*
 *划分算法
 *a为待划分数组,w为其权值数组,p为开始下标,r为结束下标,返回值为中心元下标
 *功能是将数组进行划分,其中心元为数组最末端元素,划分后,比中心元小的元素在左边
 *比中心元大的元素在右边,中心元在中间
 */
int partition(int a[],float w[],int p,int r)
{
	int x=a[r];
	int i=p-1;
	for(int j=p;j<r;j++)
	{
		if(a[j]<=x)
		{
			i++;
			swap(a[i],a[j]);
			swap(w[i],w[j]);
		}
	}
	swap(a[i+1],a[r]);
	swap(w[i+1],w[r]);

	return i+1;

}
/*
 *划分算法
 *a为待划分数组,w为其权值数组,p为开始下标,r为结束下标,z为中心元,返回值为中心元下标
 *功能是将数组进行划分,中心元为指定元素z,划分后,比z小的元素在左边
 *比z大的元素在右边,z在中间
 */
int partition2(int a[],float w[],int p,int r,int z)
{
	int t=0;//记录a中等于z的元素的下标,便于将这个元素交换到中间
	int i=p-1;
	for(int j=p;j<=r;j++)
	{
		if(a[j]<=z)
		{
			
			i++;
			if(a[j]==z)
			{
				t=i;
			}
			swap(a[i],a[j]);
			swap(w[i],w[j]);	
		}
	}
	swap(a[i],a[t]);
	swap(w[i],w[t]);

	return i;

}
/*
 *选择算法
 *a为待选择的数组,w为其权值数组,p为开始下标,r为结束下标,k为待选择数组元素个数的中间值,返回值为带权中位数
 *功能是选择带权中位数,先用中位数的中位数方法,求出n个不同的元素的中位数xk
 *然后计算小于xk的元素的权值和wl,大于xk的元素的权值和wr
 *如果wl<0.5 and wr<=0.5,则xk即为所求
 *如果wl>=0.5,则对xk左边的数组元素递归调用select函数,否则对xk右边的数组元素递归调用select函数
 */
int select(int a[],float w[],int p,int r,int k)   
{
	float wl=0.0,wr=0.0;//中位数的权值和wl,wr
	if (r-p<5)
	{
		quicksort(a,w,p,r);
	//	return a[p+k-1];
		for(int m=p;m<p+k-1;m++)
		{
			wl+=w[m];//比x小的元素的权值和
		}
		for(m=p+k;m<=r;m++)
		{
			wr+=w[m];//比x大的元素的权值和
		}
		if(wl<0.5 && wr<=0.5)
			return a[p+k-1];//符合带权中位数的条件返回
		else if(wl>=0.5)
		{
			w[p+k-1]+=wr;//处理x的左端
			return select(a,w,p,p+k-1,(k+1)/2);
		}
		else
		{
			w[p-k+1]+=wl;//处理x的右端
			return select(a,w,p+k-1,r,(r-p-k+3)/2);
		}
	}

    for (int i=0;i<(r-p+1)/5;i++)//分组排序,将中位数交换到数组前端
	{
		quicksort(a,w,p+5*i,p+5*i+4);
		swap(a[p+5*i+2],a[p+i]);
		swap(w[p+5*i+2],w[p+i]);
	}

	int x=select(a,w,p,p+(r-p+1)/5-1,(((r-p+1)/5)+1)/2);//中位数的中位数
	i=partition2(a,w,p,r,x);//计算x前半区元素个数

	int j=i-p+1;

	for(int m=t;m<i;m++)
	{
		wl+=w[m];//比x小的元素的权值和
	}
	for(m=i+1;m<=r;m++)
	{
		wr+=w[m];//比x大的元素的权值和
	}
	if(wl<0.5 && wr<=0.5)
		return a[i];//符合带权中位数的条件返回
	else if(wl>=0.5)
	{
		w[i]+=wr;//处理x的左端
		t=i;
		return select(a,w,p,i,(j+1)/2);
	}
	else
	{
		w[i]+=wl;//处理x的右端
		t=i;
		return select(a,w,i,r,(r-i+1+1)/2);
	}
}


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二维邮局选址问题-带权中位数 的相关文章

  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐

  • BasicDao

    DBUtil Druid任然存在不足 如果再进行一次封装 gt BasicDao作为实现所有数据库常用的基础查询操作 1 所有数据库操作的基础类 public class BasicDao
  • 字符串补全空格是一种常见的字符串处理操作,它可以用于在字符串的两侧或者特定位置插入空格,以使字符串的长度达到指定的长度

    字符串补全空格是一种常见的字符串处理操作 它可以用于在字符串的两侧或者特定位置插入空格 以使字符串的长度达到指定的长度 在Python中 我们可以使用多种方法实现字符串的补全空格操作 下面是一些常见的方法及其示例代码 1 使用字符串的内置方
  • java中的锁(一)(Synchronized)

    JAVA中的锁 乐观锁 悲观锁 自旋锁 synchronized 原子性 可见性 有序性 可重入性 Synchronized底层原理 JAVA中的锁主要用于保障多线程中数据的一致性 在使用对象或者方法之前加锁 此时如果有其他线程也需要使用该
  • 一次暴露面全开的红帽渗透测试【getshell】

    声明 本文仅限于技术讨论与分享 严禁用于非法途径 若读者因此作出任何危害网络安全行为后果自负 与本号及原作者无关 0x01 信息收集阶段 注 本次信息收集过程主要使用FOFA网络探测平台 https fofa info 一开始进行收集的时候
  • COCOAPI评价指标解析及改进

    程序入口 python eval coco py 特别说明 results test json格式如下 image id 19 category id 1 bbox 121 4 116 02 560 56 303 83 score 0 97
  • windows下安装redis和redis扩展

    windows下安装redis 下载地址 https github com MSOpenTech redis releases Redis 支持 32 位和 64 位 这个需要根据你系统平台的实际情况选择 这里我们下载 Redis x64
  • 链路mtu

    常常见到交换机和网卡说明中提到支持Jumbo Frame 但我一直对以太网的Jumbo Frame 巨帧 如何使用不太理解 今日在网上找到2则现摘录下来 相信看了以后大家会有收获 这是一种厂商标准的超长帧格式 专门为千兆以太网而设计 目前还
  • 移动硬盘需要格式化才能打开如何解决?

    当我们把移动硬盘接入 就提示需要格式化 这是对我们有多大的仇怨啊 其实不是这样的 当频繁使用可移动硬盘很容易造成损坏 有时甚至会提示格式化 而提示要格式化是硬盘出现了问题导致的 那么什么原因才会出现的情况呢 遇到移动硬盘需要格式化才能打开如
  • 【算法训练 (day2)】积木画(dp问题)

    目录 一 问题 题目描述 输入格式 输出格式 输出样例 二 解题思路 合法性判定 状态压缩 推导dp式 代码实现 一 问题 题目描述 小明最近迷上了积木画 有这么两种类型的积木 分别为 I 型 大小为 2 个单位面积 和 L 型 大小为 3
  • Spdlog库编译/交叉编译

    1 只包含头文件 速度很快 无需依赖第三方库 支持跨平台 Linux Windows on 32 64 bits 支持多线程 可对日志文件进行循环输出 可每日生成日志文件 可支持控制台日志输出 可选的异步日志 可定义日志格式 2 获取spd
  • centos7下opencv3.4.1 的安装和编译全解

    centos7下opencv3 4 1 的安装和编译全解 一 下载和安装 1 下载网址 https opencv org 注意系统版本 2 linux下依赖库安装 正式安装opencv之前 需要安装好opencv编译的依赖包 列举如下 1
  • 【Pandas】修改Pandas的行或列的名字(重命名)

    pandas DataFrame rename 使用函数 DataFrame rename mapper None index None columns None axis None copy True inplace False leve
  • 编译Android 2.3源码错误总结

    虽然版本2 3很老了 但是这是在完全新的Ubuntu上面编译的 可以使我们更加熟练 1 host C acp lt build tools acp acp c
  • BP神经网络在数据预测上的应用

    用BP神经网络做数据预测有两种形式 1 根据自身已有的数据预测未来的数据 比如 根据2000 2012年已知GDP的值预测2013年GDP的值 求解 用2000 2001 2002的值作为输入 2003作为输出 然后以此类推 2001 20
  • DEDE后台添加新变量出现:Request var not allow!的解决办法

    论坛上很多人都反馈说在后台添加新变量的时候会出现 Request var not allow 的BUG错误 本文主要就是介绍如何去解决这个问题 下面看具体操纵 在DEDE根目录打开 include common inc php 文件 查找到
  • pycharm 2019.2 安装包失败

    简介 最近使用学生账号注册了pycharm 貌似全家桶都可以免费用了 就升级了pycharm到最新版 但是在使用包管理 安装包的时候出错了 提示没有匹配的版本 下面还提示一个 trusted host pypi douban com 右下角
  • es搜索 核心指标_ElasticSearch核心知识总结(一)es的六种搜索方式和数据分析

    es的六种搜索方式 query string search GET ecommerce product search 查询所有数据 took 4 耗费几毫秒 timed out false 是否超时 shards 数据拆分成5个分片 对所有
  • Qt编写软件注册功能

    一 软件目的 应项目需求 需要为编写的软件添加一层保护 防止滥用 二 软件环境 Qt5 9 Windows 主要加密算法 MD5 MD5简单介绍 MD5是一种不可逆的加密算法 类似计算hash值 不同的数据字符无论长短 经过MD5计算后都会
  • Pip快速离线安装pytorch-gpu

    Pip快速离线安装pytorch gpu 1小节讲解涉及的基本概念 读者也可直接从2小节开始 1 安装pythorch涉及的基本组件概念 1 1 显卡驱动Driver 常识概念 此处略过 1 2 CUDA CUDA Compute Unif
  • 二维邮局选址问题-带权中位数

    算法设计练习作业 邮局选址问题 将自己写的分享 有问题请指正 希望共同学习 关于邮局选址问题的理论知识就不赘述了 网上有讲解的 include