1. 程式人生 > >51Nod 1110 距離之和最小 V3 中位數 思維

51Nod 1110 距離之和最小 V3 中位數 思維

temp sort c++ eve closed cin struct 算法 數量

基準時間限制:1 秒 空間限制:131072 KB 分值: 40 難度:4級算法題

X軸上有N個點,每個點除了包括一個位置數據X[i],還包括一個權值W[i]。
點P到點P[i]的帶權距離 = 實際距離 * P[i]的權值。
求X軸上一點使它到這N個點的帶權距離之和最小,輸出這個最小的帶權距離之和。
Input
第1行:點的數量N。(2 <= N <= 10000)
第2 - N + 1行:每行2個數,中間用空格分隔,分別是點的位置及權值。
(-10^5 <= X[i] <= 10^5,1 <= W[i] <= 10^5)
Output
輸出最小的帶權距離之和。
Input示例
5
-1 1
-3 1

0 1
7 1
9 1
Output示例
20

思路:
x的權重為w,相當於有w個點在x的位置,之後按照中位數處理
統一按照奇數的處理方法過了,但是分類討論奇數和偶數卻有一些例子過不了(怕不是測試數據有問題),郁悶

註意使用long long
代碼:

技術分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 struct node {
 4     long long x,w;
 5 }data[10005];
 6 bool cmp(node a, node b) {
 7     if(a.x<b.x) return true
; 8 return false; 9 } 10 int main() { 11 ios::sync_with_stdio(false); 12 int n,len=0; 13 long long num; 14 cin>>n; 15 long long sum=0; 16 for(int i=0;i<n;++i) { 17 cin>>data[i].x>>data[i].w; 18 len+=data[i].w; 19 } 20 sort(data,data+n,cmp);
21 int temp=len/2+1; 22 for(int i=0;i<n;++i) { 23 if(temp>data[i].w) temp-=data[i].w; 24 else { 25 num=data[i].x; 26 break; 27 } 28 } 29 for(int i=0;i<n;++i) sum+=abs(data[i].x-num)*data[i].w; 30 cout<<sum<<endl; 31 return 0; 32 }
View Code

51Nod 1110 距離之和最小 V3 中位數 思維