送貨站選址問題

2021-06-03 16:47:38 字數 2135 閱讀 9796

題目:有n個商店,分布在x[i]位置上,每個商店每天需要進貨w[i]噸,問送貨站建在**,代價最小?

分析:進貨量:w[0]  w[1]  w[2]  ...  w[i]   w[i+1]  w[i+2]  ...  w[n]

位   置:x[0]   x[1]   x[2]  ...  x[i]    x[i+1]   x[i+2]  ...  x[n]

送貨站:                                    x^

假設送貨站的位置在x處,如果x位於x[i]和x[i+1]之間,那麼送貨的代價是:

w[0]*(x - x[0]) + w[1]*(x - x[1]) +  ...  + w[i]*(x - x[i]) + w[i+1]*(x[i+1] - x) + w[i+2]*(x[i+2] -x) +  ...  w[n]*(x[n] - x) 化簡為下面形式:

(w[i+1]*x[i+1] + w[i+2]*x[i+2] +  ...  + w[n]*x[n] - w[0]*x[0] - w[1]*x[1] -  ...  - w[i]*x[i]) + (w[0] + w[1] + ... + w[i] - w[i+1] - w[i+2] - ... - w[n])*x,x取值範圍是x[i] 到 x[i+1]

如果(w[0] + w[1] + ... + w[i] - w[i+1] - w[i+2] - ... - w[n])為正值,x應該取x[i],反之,x應該取x[i+1],這樣可以使得代價最小

從1到n-1遍歷所有的i,分別計算兩部分的值,將計算的代價值儲存在乙個陣列中,掃瞄一遍陣列,取出其中的最小代價值,就可以確定出x的位置。

在計算迴圈的過程中要反覆計算 sum(w[0]x[0] ... w[i]x[i]) 和sum(w[i+1]x[i+1] ... w[n]x[n])這需要一層迴圈,再加上i本身的一層迴圈,演算法的複雜度是o(n^2)的,其實sum的計算可以通過sum(w[0]x[0] ... w[i]x[i]) = sum(w[0]x[0] ... w[i-1]x[i-1]) + w[i]x[i]來計算,而sum(w[i+1]x[i+1] ... w[n]x[n]) = sum(w[0]x[0] ... w[n]x[n]) - sum(w[0]x[0] ... w[i]x[i])來計算,事先可以通過一次掃瞄計算出sum(w[i+1]x[i+1] ... w[n]x[n]),後面就不用再迴圈計算sum了,從而減少了一層迴圈,降低了複雜度到o(n)

預先計算和最後的求最小代價都是o(n),因此整個演算法的複雜度為o(n)

程式如下:

#include #include int deliveryselection(int weight, int position, int length) 

int sum_cost = 0;

for (int i = 0; i < length; ++i)

int cost_ending_here = 0;

int weight_ending_here = 0;

int pos = 0;

for (int i = 0; i < length; ++i) else

cost[i] = (sum_cost - cost_ending_here) - cost_ending_here +

(weight_ending_here - (sum_weight - weight_ending_here)) * pos;

} int min_cost = 0x7fffffff;

int min_pos = -1;

for (int i = 0; i < length; ++i)

} return position[min_pos];

}

int main(int argc, char** argv) ;

int position = ;

int array_size = sizeof(weight) / sizeof(int);

int selected_position = deliveryselection(weight, position, array_size);

printf("deliveryposition:%d\n", selected_position);

}

相似問題:

程式設計之美 1.8

郵局選址問題

在乙個按照東西和南北方向劃分成規整街區的城市裡,n個居民點散亂地分布在不同的街區中。用 x 座標表示東西向,用 y座標表示南北向。各居民點的位置可以由座標 x,y 表示。街區中任意2 點 x1,y1 和 x2,y2 之間的距離可以用數值 x1 x2 y1 y2 度量。居民們希望在城市中選擇建立郵局的...

商店選址問題

description 給出乙個城市的地圖 用鄰接矩陣表示 商店設在一點,使各個地方到商店距離之和最短。input 第一行為n 共有幾個城市 n小於201 第二行至第n 1行為城市地圖 用鄰接矩陣表示 output 最短路徑之和 sample input 3 0 3 1 3 0 2 1 2 0 sa...

商店選址問題

商店選址問題 time limit 10000ms memory limit 65536k total submit 336 accepted 87 case time limit 1000ms description 給出乙個城市的地圖 用鄰接矩陣表示 商店設在一點,使各個地方到商店距離之和最短。...