AcWing104.货仓选址

AcWing104.货仓选址

题目

在这里插入图片描述

代码

#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
    int N=100010;//N为自己设定的数组的大小,a[N]为设立的输入数组
    int n,a[N],i,c,s;//注意此处的a[N],不能为a[n],我就犯了这种低级错误,找了好久才发现,哈哈哈哈
    s=0;
	cin >> n;//总共有多少个商店
	for(i = 0; i < n; i++)
	  cin >> a[i];//a[i]为每个商店的坐标
	sort(a,a+n);//sort函数C++中对数组进行排序得函数,默认为升
	c=(a[n/2]+a[(n-2)/2])/2;//当n为偶数时的中位数
    	if (n%2==1)
	{
		for(i = n -1; i >= 0; i--)
		s+=abs(a[(n-1)/2]-a[i]);
	}
	else
	{
	    for(i = n-1; i >= 0; i--)	
	    s+=abs(c-a[i]);
	} 
	cout << s << endl;
	return 0;
} 

解释说明

图一

商店A
仓库
商店B
商店C
商店D

图二

仓库
商店A
商店B
商店C
商店D

通过图一图二比较我们可以得知,当仓库位于中间时的距离较在外围要小,且仓库在中位数时距离最小。然而当商店为个数为奇数还是偶数对中位数还有影响。
通过分析我们可以得到以下结论:
当为奇数时中位数为a[(n-1)/2];
当为偶数时中位数为(a[n/2]+a[(n-2)/2])/2.
用以上结论的前提是:
1:数组中的数必须已经按照从小到大或的顺序排好(若为从大到小当为偶数中位数会发生改变)
2:将数存入数组需以a[0]开始
此题还可以根据nth_element()函数来做头文件是include
语法为:nth_element(iarray,iarray+a,iarray+n)
其中iarray为一个int型的数组,n为数组长度,但由于此函数没有返回值所以不可以写成k=nth_element(iarray,iarray+a,iarray+n;cout << k;的形式,应该为nth_element(iarray,iarray+a,iarray+n);cout << iarray[a];
iarray[a]表示的是将数组从小到大排列好后的第a+1个数,即:iarray[a]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值