Mixing Milk 混合牛奶 USACO

2021-06-21 15:45:45 字數 1571 閱讀 7661

★mixing milk 混合牛奶 

牛奶包裝是乙個如此低利潤的生意,所以盡可能低的控制初級產品(牛奶)的**變的十分重要. 請幫助快樂的牛奶製造者(merry milk makers)以可能的最廉價的方式取得他們所需的牛奶. 快樂的牛奶製造公司從一些農民那購買牛奶,每個農民賣給牛奶製造公司的**不一定相同. 而且,如乙隻母牛一天只能生產一定量的牛奶,農民每一天只有一定量的牛奶可以賣. 

每天,快樂的牛奶製造者從每個農民那購買一定量的牛奶,少於或等於農民所能提供的最大值. 給出快樂牛奶製造者的每日的牛奶需求,連同每個農民的可提供的牛奶量和每加侖的**,請計算快樂的牛奶製造者所要付出錢的最小值. 

注意: 

每天農民生產的牛奶的總數對快樂的牛奶製造者來說足夠的. 

input format

第 1 行:二個整數, n 和 m. 

第乙個數值,n,(0<= n<=2,000,000)是快樂的牛奶製造者的一天需要牛奶的數量. 

第二個數值,m,(0<= m<=5,000)是他們可能從農民那買到的數目. 

第 2 到 m+1 行:每行二個整數,pi 和 ai. 

pi(0<= pi<=1,000) 是農民 i 牛奶的**. 

ai(0 <= ai <= 2,000,000)是農民 i 一天能賣給快樂的牛奶製造者的牛奶數量.

可以使用貪心演算法解答,每一步都尋找牛奶單價最低的農民,買走農民全部的牛奶,直到需要的牛奶n滿足為止。所以本題可以抽象為尋找最小的k個數,只是這裡的k並不確定而已。

尋找最小的k個數可以使用直接搜尋法,複雜度為o(n*k)。也可使用排序法,使用快速排序時間複雜度為o(nlogn + k)。也可使用堆排序,若k確定,可以構造大小為k的最大堆。引用july部落格(的原文為:

用容量為k的最大堆儲存最先遍歷到的k個數,並假設它們即是最小的k個數,建堆費時o(k)後,有k1

o(n*logk)

。此方法得益於在堆中,查詢等各項操作時間複雜度均為logk(不然,就如上述思路2所述:直接用陣列也可以找出前k個小的元素,用時o(n*k))。

由於此處k並不確定,使用最小堆,每次取出堆頂元素,並更新堆,時間為o(n + logn * k)。順便複習下堆演算法。

public class p1 	}	

/*** 獲取堆頂元素的值

*/public milk get()

/*** 刪除堆頂元素

*/public milk delete()else

}/**

* 使刪除堆頂元素的堆重新成為堆

* 使第i個元素下降

*/public void heapify(int i)

if(child >= heap.size())

if(element > heap.get(child).price)else

} heap.set(j, e); }

public static void main(string args)

p.buildhead();

while(total > 0)else

} system.out.println(money); }

} class milk

USACO混合牛奶

題目 問題 a 混合牛奶 時間限制 1 sec 記憶體限制 128 mb 提交 39 解決 25 提交 狀態 討論版 命題人 201805050252 題目描述 牛奶包裝是乙個如此低利潤的生意,所以盡可能低的控制初級產品 牛奶 的 變的十分重要。請幫助快樂的牛奶製造者 merry milk make...

高階37 混合牛奶

37 混合牛奶 問題描述 牛奶包裝是乙個如此低利潤的生意,所以盡可能低的控制初級產品 牛奶 的 變得十分重要。請幫助快樂的牛奶製造者 merry milk makers 以可能的最廉價的方式取得他們所需的牛奶。快樂的牛奶製造公司從一些農民那購買牛奶,每個農民賣給牛奶製造公司的 不一定相同。而且,如一...

USACO Section1 3 混合牛奶

我對貪心的理解就是通過每一步的最優解找的整體的最優解。往往通過乙個迴圈語句即o n 的複雜度來解決問題,所以資料上總說貪心演算法往往是所有演算法中最快的。另外貪心往往用到排序,所以 sort 的用法要記牢,不管對陣列還是結構體。具體到這個題就要先依據單價進行排序,這裡就要求要把資料儲存為結構體形式。...