題目:一家賣**的**商店,總共有n個倉庫,每個倉庫都存有一定量的**儲備。現在要求進行倉庫庫存的均衡,使得所有倉庫存有的**量相同。但是要求**只能在相鄰的倉庫之間進行運輸。請給出一種最佳的解決方案,使得總的運輸量最小。
解析:首先,我們需要求出每個倉庫在均衡之後,應該存有的**量。然後根據這個值來確定當前每個倉庫的庫存富餘或短缺的量。為了使得總的運輸量最小,我們需要讓那些富餘的倉庫中的富餘部分應該往左邊和右邊的運輸量。因此整個過程應該如下:
1.計算倉庫均衡後每個倉庫應該儲存的**量,並計算出當前倉庫的富餘和短缺情況;
2.找出富餘最多的倉庫位置機器富餘量m
3.計算最富餘倉庫左邊所有倉庫的富餘和短缺情況s
(1)當s<0,且|s| < m,則此時最富餘倉庫應該往左邊運輸|s|,往右邊運輸m - |s|
(2)當s<0,且|s| > m,則此時最富餘倉庫應該運輸所有的富餘到左邊
(3)當s>0,此時最富餘的倉庫應該運輸所有的富餘到右邊
4.如果倉庫為均衡,則迴圈步驟2和步驟3
有了上面的分析,則**實現則不困難了:
//
//問題描述:
//設**乙個**賣家有n個倉庫,每個倉庫的存貨量不同,現要平衡各個倉庫間的
//存貨量,使得每個倉庫的存貨量均相等,請設計演算法,在各個倉庫間移動貨物,使
//得移動貨物的代價最小(貨物移動量最小),貨物只能在相鄰的倉庫間移動。設計
//演算法並**實現。
#pragma once
#include #include #include #include #include using namespace std;
typedef vector::iterator iter;
////@brief : 計算最小代價
//@return : 返回最小代價
double mincost(vector& barn);
int main()
cout << mincost(barn) << endl;
system("pause");
}double _mincost(iter& offset, iter& first, iter& last)
else if(left_sum < 0.0 && *max_iter + left_sum < 0.0)
else if(left_sum > 0.0)
}if(max_iter != last - 1 && *max_iter >= 0.0)
double ret = left + right + curr;
return ret;
}double mincost(vector& barn)
問題擴充套件:
此處假設倉庫是直線型的,若假設倉庫是乙個環形的,即第乙個倉庫和第n個倉庫是鄰居倉庫,它們之間可以相互運輸,那麼問題應該如何解決?
若假設每乙個倉庫之間是乙個圖的關係,即每乙個倉庫都與其中一些倉庫相鄰,則問題又該如何解決呢?
阿里筆試題
計算二叉樹每一層的和 24for int i 0 i 29list.add index 30 31int sum 0 32for int i 0 i 35 兩個端點的數,是去除裡面第乙個,或者最後倒數第二個,比較去掉最小的那個 36int max sum math.min list.get 1 li...
阿里筆試題目
題目描述 乙個 的訂單中包含n 10 n 1 種商品a1,a2,an,每種商品數量分別為a1,a2,an個,記做 ak 0 訂單在倉庫生產過程中,倉庫為了提公升作業效率,會提前對熱門組合商品進行預包裝。假設這n個商品有m 9 m 1 個商品組合,每個組合bomk包含a1,a2,an的數量分別為 bk...
阿里筆試題 概率
題目 輸入n為序列內數的個數 用vectora 儲存輸入的n個數 先將a公升序 由於我們要求所有組合中最大值的期望 例如輸入n 3 4 5 6 所有組合如下 分析 我們換一種思路 只需要求最大值為某個數時的組合情況有多少種 由於a為公升序 從a的尾部往前掃瞄 最大值為6時 有2的2次方種組合 最大值...