題目:有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 給出乙個城市的地圖 用鄰接矩陣表示 商店設在一點,使各個地方到商店距離之和最短。...