中位数及带权中位数问题(转)

先从一到简单的题看起:

士兵站队问题

在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点由整数坐标(x,y)表示。士兵们可以沿网格边上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选择x和y的值才能使士兵们以最少的总移动步数排成一列。

分析:这个问题我们可以把X,Y分开看,两者互不影响。其实就是求所以横坐标的中点,也就是中位数,那么为什么呢?

我们可以把所选定的位置左右的两个点看成一对,只要所选位置在两者之间,那么长度恒等于两点的线性距离和,所以我们可以根据每一对不断缩小我们所选位置的范围,最后如果有奇数个点,那么就会在中间的那个点上,如果是偶数那么在中间两个数和他们所构成的区间,这样想就容易发现中位数这一规律了。


 

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int x[10010],y[10010];
int main()
{freopen("sol.in","r",stdin);freopen("sol.out","w",stdout);int n,i,sum=0,s;cin>>n;for (i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);sort(x+1,x+n+1);sort(y+1,y+n+1);s=y[(1+n)/2];for (i=1;i<=n;i++)sum+=abs(y[i]-s);for (i=1;i<=n;i++)x[i]-=i;sort(x+1,x+n+1);s=x[(1+n)/2];for (i=1;i<=n;i++)sum+=abs(x[i]-s);cout<<sum<<endl;fclose(stdin);fclose(stdout);return 0;
}

再看看中位数与动归结合的应用:

[问题描述]

一些村庄被建在一条笔直的高速公路边上。我们用一条坐标轴来描述这条高速公路,每一个村庄的坐标都是整数。没有两个村庄坐标相同。两个村庄间的距离,定义为它们坐标值差的绝对值。

人们需要在一些村庄建立邮局——当然,并不是每一个村庄都必须建立邮局。邮局必须被建在村庄里,因此它的坐标和它所在的村庄坐标相同。每个村庄使用离它最近的那个邮局,建立这些邮局的原则是:所有村庄到各自所使用的邮局的距离总和最小。

你的任务是编写一个程序,在给定了每个村庄的坐标和将要建立的邮局数之后,按照上述原则,合理地选择这些邮局的位置。

输入文件的文件名是post.in

文件的第输入文件中同一行相邻两项之间用一个或多个空格隔开。

一行是包含两个整数:第一个整数是村庄的数目V,1〈=V〈=300,第二个整数是将建立的邮局数P,1〈=P〈=30且P〈=V。

文件的第二行按照递增顺序列出了V个整数。这V个整数分别表示了各村庄的位置坐标。对于每一个位置坐标X,1〈=X〈=10000。

输出文件名是post.out

文件的第一行是一个整数S,表示你所求出的所有村庄到离它最近邮局的距离的总和。

相应地,文件的第二行按照递增顺序列出了P个整数,分别表示你所求出每个邮局的建立位置。虽然对于同一个S,可能会有多种邮局建立的方案,但只需输出邮局位置尽量靠前的一组。

Example

Post.in

10   5

1 2 36 7 9 11 22 44 50

Post.out

9

2 7 2244 50 

这一道题是很经典的区间动态规划题,在预处理中就用到了上述思想。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,len[320][320],f[320][320],a[320],s[320][320],m1[320][320];
void print(int x,int y)
{if (x==0)return;print(x-1,s[x][y]);printf("%d ",a[m1[s[x][y]+1][y]]);
}
int main()
{freopen("post.in","r",stdin);freopen("post.out","w",stdout);int i,j,k;scanf("%d%d",&n,&m);for (i=1;i<=n;i++)scanf("%d",&a[i]);for (i=1;i<=n;i++)for (j=i;j<=n;j++){m1[i][j]=(i+j)/2;int temp1=0;for (k=i;k<=j;k++){len[i][j]+=abs(a[k]-a[m1[i][j]]);}}memset(f,127,sizeof(f));for (i=1;i<=n;i++){f[1][i]=len[1][i];s[1][i]=0;}for (i=2;i<=m;i++)for (j=i;j<=n;j++)for (k=i-1;k<=j-1;k++)if (f[i][j]>f[i-1][k]+len[k+1][j]){f[i][j]=min(f[i][j],f[i-1][k]+len[k+1][j]);s[i][j]=k;}cout<<f[m][n]<<endl;print(m,n);return 0; 
}


中位数解决了,那么就来看一下带权中位数问题,这个问题如果不知道,一定会觉得某些题十分的高大上,无从下手。例如

典型的带权中位数问题,把平面转成线性即可。为何带权中位数问题就是就权值的中位数呢,我们可以这么想,不带权的相当于权为1,每个点只有一个人,那么带权就相当每个点有该点权值个人,这样理解就与上面的思路神合了
ps:证明过程
若最优点在T
则有:
∑{D*DIST(I,T)}(I<>T)<=∑{D*DIST(I,T+1)}(I<>T+1)
将此式化为:
∑{D[L]}*DIST(L,T)}+∑{D[R]*DIST(R,T)}+D[T+1]*DIST(T+1,T)
<=∑{D[L]}*DIST(L,T+1)}+∑{D[R]*DIST(R,T+1)}+D[T]*DIST(T,T+1) (L<T&R>T+1)
即:
∑{D[L]*DIST(L,T+1)}-∑{D[L]*DIST(L,T)}(L<T)+D[T]*(DIST(T,T+1))>=∑{D[R]*DIST(R,T)}-∑(D[R]*DIST(R,T+1))(R>T+1)+D[T+1]*(DIST(T,T+1))进一步化简为:
∑{D[L]*(DIST(L,T)-DIST[L,T+1])}(L<=T)<=∑{D[R]*(DIST(R,T+1)-DIST(R,T))}(R>=T+1)∵DIST(L,T)-DIST(L,T+1)=DIST(T,T+1)
DIST(R,T+1)-DIST(R,T)=DIST(T+1,T)
OBVIOUSLY : DIST(T,T+1)=DIST(T+1,T)
因此:
∑D[L](L<=T)>=∑(D[R])(R>=T+1)
即:∑D[L](L<T)+D[T]>=∑(D[R])(R>T)
因此我们发现,若T是最优点,则必有其左边的权值和加上D[T]后大于右边的权值和
而类似的,我们可以证明其右边的权值和加上D[T]后大于左边的权值和
因此我们要找的点也就是满足以上条件的点。
注意到此时我们的选择已经和具体的位置(坐标)没有关系了,而成为主要考虑因素的仅仅是各点上的权值。
因为左边的权值和数+D[T]>=右边的权值和,那么:
LEFTSUM+D[T]>=RIGHTSUM=SUMALL-(LEFTSUM+D[T])
=>2*(LEFTSUM+D[T])>=SUMALL
=>2*RIGHTSUM<=SUMALL
同理可得:
RIGHTSUM+D[T]>=LEFTSUM=SUMALL-(RIGHTSUM+D[T])
=>2*(RIGHTSUM+D[T])>=SUMALL
=>2*LEFTSUM<=SUMALL
此时我们发现:
2*LEFTSUM<=SUMALL 而 2*(LEFTSUM+D[T])>=SUMALL
也即是说当前的位置T上的数包含了第[(SUMALL)/2]个数,由开篇的简述可知,这第[(SUMALL)/2]个数,就是这个序列中的带权中位数。所以这一类问题,实质上就是带权中位数问题。
 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct data
{int x,y,w;
};data num[50003];
int n,i,j,k;
double sum,ans,xx,yy;
int xl,yl;
int cmp(data a,data b)
{return a.x<b.x;
}
int cmp1(data a,data b)
{return a.y<b.y;
}
int main()
{freopen("ball.in","r",stdin);freopen("ball.out","w",stdout);scanf("%d",&n);sum=ans=xx=yy=0;for (i=1;i<=n;i++){scanf("%d",&num[i].w);sum+=num[i].w;}for (i=1;i<=n;i++)scanf("%d%d",&num[i].x,&num[i].y);sort(num+1,num+n+1,cmp);double mid=sum/2;for (i=1;i<=n;i++){xx+=num[i].w;if (xx>mid){xl=num[i].x;break;}}for (i=1;i<=n;i++)ans+=num[i].w*(abs(num[i].x-xl));sort(num+1,num+n+1,cmp1);for (i=1;i<=n;i++){yy+=num[i].w;if (yy>mid){yl=num[i].y;break;}}for (i=1;i<=n;i++)ans+=num[i].w*(abs(num[i].y-yl));printf("%0.2lf",ans);
}

原博客链接:链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

*【HDU - 4272 】LianLianKan (dfs 或 状压dp,贪心不行)

题干&#xff1a; I like playing game with my friend, although sometimes looks pretty naive. Today I invent a new game called LianLianKan. The game is about playing on a number stack. Now we have a number stack, and we should link and pop the same element…

java中的values函数_巧用valueat函数(快逸免费版)

在制作报表时&#xff0c;经常会遇到将数据库里一列数据按照条件取值后&#xff0c;分为多列显示的需求&#xff0c;例如&#xff1a;数据库中有一列名为type的数据&#xff0c;在报表中&#xff0c;第一列选择type为1的数据&#xff0c;第二列选择type为2的数据。由于受到扩展…

Java设计流程执行器_Java进阶面试精选系列:SpringMVC+SpringBoot+Hibernate+Mybatis+设计模式...

小编精心收集&#xff1a;为金三银四准备&#xff0c;以下面试题先过一遍&#xff0c;为即将到了的面试做好准备&#xff0c;也过一遍基础知识点。一、Spring/Spring MVC1.为什么要使用 spring&#xff1f;2.解释一下什么是 aop&#xff1f;3.解释一下什么是 ioc&#xff1f;3.…

【牛客 - 370E】Rinne Loves Gift(Bellman_Ford判负环,二分,分数规划)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/E 来源&#xff1a;牛客网 Rinne 喜欢礼物&#xff0c;也喜欢送礼物 圣诞节快到了&#xff0c;Rinne 要去给给住在城市里的人送礼物 城市的交通可以抽象成一个 n 个点 m 条边的有向图 每条边上有…

【POJ - 2976】【ZOJ - 3068】【SCU - 2992】Dropping tests (01分数规划)

题干&#xff1a; In a certain course, you take n tests. If you get ai out of bi questions correct on test i, your cumulative average is defined to be . Given your test scores and a positive integer k, determine how high you can make your cumulative aver…

重写过的url 怎么获取当前页面url java_网站URL重写(Java UrlRewrite 的使用)

现在大部分的网站和商城都会使用到URL重写&#xff0c;接触到这个&#xff0c;也是因为正在做的电子商务商城。URL重写&#xff0c;是将原有的URL采用另一种规则来显示&#xff0c;使得用户方便访问同时也屏蔽一些信息。在此说下它的好处&#xff0c;在开发过程中&#xff0c;经…

Java行业情景分析_Java 设计模式情景分析——单例模式

单例模式可以说是应用最广的模式之一&#xff0c;在应用单例模式时&#xff0c;单例对象的类必须保证只有一个实例存在&#xff0c;而且可以自行实例化并向整个系统提供这个实例。一般在不能自由构造对象的情况下&#xff0c;就会使用单例设计模式&#xff0c;例如创建一个对象…

php实现播放直播_PHP直播技术分享(一:实现直播)

推流服务器采用的是自搭的推流服务器 , 自己玩玩 做外包项目还是去搞七牛云/阿里这样的服务器吧,开始bb-----1:技术栈image.jpeg2:开发中业务(1)主播申请时创建个秘钥 , 这个秘钥随时字符串即可到时候根据字符串找到拉流的直播位置存数据库包括推流地址image.png3:配置nginx-rt…

php获取location,php获取header[‘location’]信息常见问题

15/01/31本文关键字: 302, header, location//初始化url信息$host “#8221;;$url$host.”l/rzTf7ap2viw/&iid222004556&resourceId0_04_05_99/v.swf”;//按照字段获取header响应信息$headers get_headers($url, TRUE);//获取这个土豆的302跳转地址$u302 $headers[“Lo…

php对联广告,html左右对联代码 cms网站对联广告html代码

实现网页左右两侧居中的对联广告代码你只记得自己有好多朋友却从没想过小编只有你一人。无标题文档 #left{ width:200px;height:450px; position:absolute; left:0px; background:red; border:1px #000 solid} #right{width:200px;height:450px; position:absolute; right:0px;…

php 分页 url重写 分页问题,解决千古难题,wordpress分页URL问题,wordpress给分页加链接...

原本的wordpress文章如果分页会成如下的结构&#xff1a;http://www.xyqzmt.cn/1.html/2通常固定链接都是这样的结构&#xff0c;设为/%postname%.html或者/%post_id%.html 以前我一直无法解决如上的问题&#xff0c;最后放弃挣扎&#xff0c;如果遇到很长的文章全都放在一个页…

【牛客 - 181F】子序列(容斥,组合数,费马小定理)

题干&#xff1a; 题目描述 给出一个长度为n的序列&#xff0c;你需要计算出所有长度为k的子序列中&#xff0c;除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T&#xff0c;表示数据组数。 对于每组数据&#xff0c;第一行两个整数N&#xff0c;k&#…

【CodeForces - 485C】Bits (二进制相关,数学,贪心)

题干&#xff1a; Lets denote as the number of bits set (1 bits) in the binary representation of the non-negative integer x. You are given multiple queries consisting of pairs of integers l and r. For each query, find the x, such that l ≤ x ≤ r, an…

php工程导致系统蓝屏,经常蓝屏是什么原因

经常蓝屏的原因&#xff1a;1、错误安装或更新显卡驱动后导致电脑蓝屏&#xff1b;2、超频过度是导致蓝屏&#xff1b;3、安装的软件存在不兼容&#xff1b;4、电脑内部硬件温度过高&#xff1b;5、内存条接触不良或内存损坏。错误更新显卡驱动错误安装或更新显卡驱动后导致电脑…

【CodeForces - 485A】Factory (水题,抽屉原理,tricks)

题干&#xff1a; One industrial factory is reforming working plan. The director suggested to set a mythical detail production norm. If at the beginning of the day there were x details in the factory storage, then by the end of the day the factory has to p…

matlab调用哈希表,ros与matlab联动使用

ros与matlab联动使用联动使用教程1 ubuntu18.04或16.04下安装matlab R2017b参考链接2 ubuntu下基于matlab启动rosmatlab中常用命令如下&#xff1a;查看robotics system toolbox工具箱是否安装成功help robotics.rosrosinit ——表示启动ROS&#xff0c;相当于roscorerosshutdo…

【CodeForces - 1020A】New Building for SIS(模拟)

题干&#xff1a; You are looking at the floor plan of the Summer Informatics Schools new building. You were tasked with SIS logistics, so you really care about travel time between different locations: it is important to know how long it would take to get …

【CodeForces - 1020B】Badge(模拟,图,环)

题干&#xff1a; In Summer Informatics School, if a student doesnt behave well, teachers make a hole in his badge. And today one of the teachers caught a group of nn students doing yet another trick. Lets assume that all these students are numbered from …

【Hihocoder - 1723】子树统计(线性基合并)

题干&#xff1a; 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵N个节点的有根树&#xff0c;树上每个节点有一个非负整数权重Wi。定义节点集合S{i1, i2, ……, ir}的总权重为&#xff1a;(⊕是异或运算) 每次询问一棵子树内所有可能出现的总权重数量&a…

【CodeForces - 485D】Maximum Value (枚举,用数组离散化,数学,取模运算,因子,筛法)

题干&#xff1a; You are given a sequence a consisting of n integers. Find the maximum possible value of (integer remainder of ai divided by aj), where 1 ≤ i, j ≤ n and ai ≥ aj. Input The first line contains integer n — the length of the seq…