题目描述

涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方,其中住了r[i]人。

松江1843路公交车要在这条路上建一个公交站,市政府希望让最多的人得到方便,因此希望所有的每一个的居民,从家到车站的距离的总和最短。

公交站应该建在哪里呢?

输入输出格式

输入格式:

第一行输入L、N。

接下来N行,每行两个整数x[i]和r[i]。

输出格式:

一个整数,最小的每个人从家到车站的距离的总和。

输入输出样例

输入样例#1:

100 3
20 3
50 2
70 1
输出样例#1:

110
输入样例#2:

100 2
0 1
100 10
输出样例#2:

100
输入样例#3:

10000000000 5
3282894320 391
4394338332 929
6932893249 181
7823822843 440
9322388365 623
输出样例#3:

5473201404068

说明

样例解释1

当建在坐标40的时候,所有人距离车站的距离总和为 |20−40|×3+|50−40|×2+|70−40|×1=110。

数据范围和约定

对于10%的数据,1≤N≤50,R[i]=1。

对于30%的数据,1≤N≤100,R[i]≤10,1≤L≤1000。

对于70%的数据,1≤N≤1000,R[i]≤100,1≤L≤10^6。

对于全部数据,1≤L≤10^10,1≤N≤10^5,0≤x[i]≤L,1≤r[i]≤1000

吐槽

  好久没做在洛谷被标成“普及+/提高”难度的题了,这题难度被标高了……

  cmath里的abs简直就是一个大坑,当传过去的参数为long long型的时,返回值依然是int!!!

  因为这个我WA90分,整整两次!

  对long long取绝对值要algorithm里的std::abs才行,再或者就手写……

解题思路

中位数的思路

  题目原型是输油管道,在这里,出题人说洛谷7月月赛题目都是改编题果然不假。

  把每个人所在的位置记录下来,排成一个数列,那么公交站的位置就是这个数列的中位数所在位置。为什么是中位数呢?可以参考输油管道这题“深海鱼的眼泪”的题解.

我把他的题解改了一点——

  如果只有一个人,那么显然是越近越好。如果有两个人,那么显然是有以下三种情况:

    1.两个人都在公交站左边,那么这个时候的两个人到公交站的长度和肯定大于两个人的坐标之差。

    2.两个人都在公交站右边,和情况1是一样的

    3.两个人,一个在公交站右边,一个在公交站左边,那么两个人到公交车站的长度和就等于两个人的坐标之差。显然情况三是所要的路径和最短的设计情况。就是当公交站在两个人之间的任意位置时,人到公交车站长度之和都等于两个人的坐标之差,是最短的长度。

  那么将这个结论推广,当有n个人的时候——

    1.n是偶数 只要这n个人分布在公交站的两边,每边n/2个,那么就是距离之和最小的。

    2.n是奇数,只要将这n个人中,坐标最中间的(也就是中位数的那个)井不算,其余的偶数个人分布在公交站的两侧,这个时候移动公交站,那么这n个人到公交车站长度之和就决定于那个没有算的人了,因为其余的井的距离之和是固定了的,这个时候只要公交站最接近中间那个人就好了。

  也就是说,公交车站的位置就是最中间的那个人(或中间的区间)。

  将各个人的坐标排序,再取 n/2+1 的位置,即最中间的位置。最后统计答案即可。

三分的思路

  设f(x)为公交站设在x处时所有人到公交站距离之和,那么有可能f(x)在[1,L]上很有可能只有一个极小值(我不会证,但这个思路可以通过所有数据点,耗时为上面那个思路的一半),那个极小值就是答案。求那个极小值就能用三分法了。这个思路来自洛谷讨论区huxulin,下面的代码也是他的。

源代码

中位数思路的代码

#include<algorithm>
#include<cstdio> struct house{
long long x,num;
bool operator < (const house & a) const{
return x<a.x;
}
}h[];
long long n,sum=;
int main()
{
scanf("%lld",&n);
scanf("%lld",&n);
for(int i=;i<=n;i++)
scanf("%lld%lld",&h[i].x,&h[i].num),sum+=h[i].num;
std::sort(h+,h++n);
long long s=,mid=(sum>>)+,pos;
for(int i=;i<=n;i++)
{
s+=h[i].num;
if(s>=mid)
{
pos=h[i].x;
break;
}
}
long long ans=;
for(int i=;i<=n;i++)
ans+=std::abs(h[i].x-pos)*h[i].num;
printf("%lld",ans);
return ;
}

三分的代码

#include <cstdio>
#include <algorithm> typedef long long LL; static const int maxm = 2e6 + ;
static const LL INF = 1LL << ; LL r[maxm],x[maxm],A[maxm];
LL L,ans,mind = INF;
LL n; LL abs(LL x){
return x > ? x : -x;
} LL f(LL D){
LL ret = ;
for(LL i = ;i <= n;i++) ret += abs(D * r[i] - x[i] * r[i]);
return ret;
} int main(){
scanf("%lld%lld",&L,&n);
for(LL i = ;i <= n;i++) scanf("%lld%lld",&x[i],&r[i]); LL l = ,r = L; while(l <= r){
LL mid = (l + r) >> ;
LL mmid = (mid + r) >> ;
if(f(mid) < f(mmid)) ans = mid,r = mmid - ;
else ans = mmid,l = mid + ;
} for(LL i = ans - ;i <= ans + ;i++)
mind = std :: min(f(i),mind); printf("%lld\n",mind); return ;
}

洛谷 P3819 松江1843路的更多相关文章

  1. 洛谷P3819 松江1843路

    P3819 松江1843路 题目描述 涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方,其中住了r[i]人. 松江1843路公交车要在这条路上建一 ...

  2. 洛谷——P3819 松江1843路

    https://www.luogu.org/problem/show?pid=3819 题目描述 涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方 ...

  3. P3819 松江1843路(洛谷月赛)

    P3819 松江1843路 题目描述 涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方,其中住了r[i]人. 松江1843路公交车要在这条路上建一 ...

  4. P3819 松江1843路

    P3819 松江1843路sigema(r[i]*abs(x[i]-x[s]));令它最小,是带权中位数问题,s是带权中位数,s左边的r[i]之和+r[s]大于s左边的r[i]之和,反过来也成立.如果 ...

  5. luogu P3819 松江1843路

    题目描述 涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方,其中住了r[i]人. 松江1843路公交车要在这条路上建一个公交站,市政府希望让最多的 ...

  6. AC日记——松江1843路 洛谷七月月赛

    松江1843路 思路: 三分: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define ...

  7. 洛谷P1556 幸福的路

    P1556 幸福的路 题目描述 每天,John都要为了农场里N(1≤N≤10)头牛的健康和幸福四处奔波. 每头牛的位置可以描述为一个二维坐标,John从坐标原点(0,0)出发.为了使路径更有趣,Joh ...

  8. 洛谷P2939 [USACO09FEB]改造路Revamping Trails

    题意翻译 约翰一共有\(N\))个牧场.由\(M\)条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场\(1\)出发到牧场\(N\)去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰 ...

  9. 洛谷 P1807 最长路_NOI导刊2010提高(07)

    最长路 #include <iostream> #include <cstdio> #include <cstring> #include <queue> ...

随机推荐

  1. ASP.NET MVC中的嵌套布局页

    在WEB窗体模式中,用惯了母版页,并且常有母版页嵌套的情况. 而在MVC模式下,对应母版页的,称作为布局页.默认的布局页为 ~/Views/Shared/_Layout.cshtml.默认每个页面都会 ...

  2. 文字过长 用 ... 表示 CSS实现单行、多行文本溢出显示省略号

    单行文本溢出显示省略号 max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;   多行文本 ...

  3. GDI+学习之------色彩与图像

    色彩 在GDI+中.色彩是通过Color类来描写叙述的.不是用RGB类.用RGB构造会出错.GDI+中的色彩信息值是由一个32位的数据来表示的,它包含8位alpha值和各8位的R.G.B值,对于alp ...

  4. 使用printf函数实现串口信息打印——设置IAR和Keil的Options

    在Keil和IAR中都可以使用printf函数,但两者设置的方法不一样.以下分别是IAR和Keil的设置. 下面是Keil的设置. 选中Options--->Target--->Code ...

  5. RMAN异机恢复实验---转载

    一.RMAN异机恢复实验 2011年3月23日00:44 1.环境介绍: 主机1: 操作系统 REDHAT5.5 IP地址 172.16.1.120 主机名 sigle 数据库版本 10.2.0.4 ...

  6. POJ 3481 set水过

    题意:1表示插入客户K,他的优先级是P(相当于大小),2表示输出当前优先级最高的客户(即找出最大值),并且删除.3同理输出最低级的. 这题可以用splay treap AVL SBT -- (可是我并 ...

  7. 2015 多校赛 第五场 1006 (hdu 5348)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题目大意:给出一幅无向图,问是否存在一种方案,使得给每条边赋予方向后,每个点的入度与出度之差小于 ...

  8. 【HTTP】长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...

  9. Eclipse安装配置——For Java

    1.下载安装JRE 2.下载Eclipse,解压到相应文件夹 3.配置Eclipse 3.1 配置字体大小  -12号 3.2配置workspace默认编码,utf-8,默认系统windows 3.3 ...

  10. Java常用设计模式《转》

    设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...