P3819 松江1843路(洛谷月賽)
阿新 • • 發佈:2017-07-02
ans += efi using tor abs 政府 pac pan
輸出樣例#1:
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
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路(洛谷月賽)