1. 程式人生 > >P3819 松江1843路(洛谷月賽)

P3819 松江1843路(洛谷月賽)

ans += efi using tor abs 政府 pac pan

P3819 松江1843路

題目描述

淶坊路是一條長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

首先我們知道車站一定會建在所有人的中間,這樣距離才可能最小,

這道題先把人數加起來,然後求中位數,相當於把n個人拆成n個點然後求中位數

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstdlib>
 4
#include<cmath> 5 #define LL long long 6 using namespace std; 7 8 struct node{ 9 LL pos,num; 10 bool operator < (const node &a) const 11 { 12 return pos < a.pos; 13 } 14 }t[100100]; 15 LL l,n,sum,ans,s,p; 16 17 int main() 18 { 19 scanf("%lld%lld",&l,&n); 20 for (LL i=1; i<=n; ++i) 21 { 22 scanf("%lld%lld",&t[i].pos,&t[i].num); 23 sum += t[i].num; 24 } 25 sort(t+1,t+n+1); 26 sum = (sum+1)/2; 27 for (LL i=1; i<=n; ++i) 28 { 29 s += t[i].num; 30 if (s>=sum) 31 { 32 p = t[i].pos; 33 break; 34 } 35 } 36 for (LL i=1; i<=n; ++i) 37 ans += abs(t[i].pos-p)*t[i].num; 38 printf("%lld",ans); 39 return 0; 40 }

P3819 松江1843路(洛谷月賽)