做專案的最大收益問題

2021-09-26 20:16:37 字數 1377 閱讀 2580

給定兩個整數w和k,w代表你擁有的初始資金,k代表你最多可以做k個專案。再給定兩個長度為n的正數陣列costs和profits,代表一共有n個專案,costs[i]和profits[i]分別表示第i號專案的啟動資金與做完後的利潤(注意是利潤,如果乙個專案的啟動資金為10,利潤為4,代表該專案最終的收入為14)。你不能並行只能序列地做專案,並且手裡擁有的資金大於或等於某個專案的啟動資金時,你才能做這個專案。該如何選擇做專案,能讓你最終的收益最大?返回最後能獲得的最大資金

[要求]

時間複雜度為o(klogn),空間複雜度為o(n)

第一行三個整數n, w, k。表示總的專案數量,初始資金,最多可以做的專案數量

第二行有n個正整數,表示costs陣列

第三行有n個正整數,表示profits陣列

輸出乙個整數,表示能獲得的最大資金

示例1

4 3 2

5 4 1 2

3 5 3 2

11
初始資金為3,最多做兩個專案,每個專案的啟動資金與利潤見costs和profits。最優選擇為:先做2號專案,做完之後資金增長到6,。然後做1號專案,做完之後資金增長到11。其他的任何選擇都不會比這種選擇好,所以返回11
1⩽k⩽n⩽10^5

1⩽w,costs[i],profits[i]⩽10^9

//演算法思路:維護乙個小堆costminheap和乙個大堆profitmaxheap,使用pair關聯cost和profit

//只要costminheap的cost小於w,我們就不斷把costminheap的top放入profitmaxheap中並pop

//然後在這一次選擇profitmaxheap的top,即小於啟動資金,又能賺取最大利潤,加到w,然後pop

//本題還可以優化,不使用這麼複雜形式的堆,不過為了練習最近學習的stl知識點,就選擇了它

//注意:w要定義為long long,否則會出現溢位

#includeusing namespace std;

//仿函式,stl中都這麼寫,如果這裡直接寫成sort那種比較函式形式,編譯不通過

//後續仿函式需要進一步學習

struct cmp

for(int i=0;i>profits[i];

}//小堆,必須補齊預設引數,預設比較pair中的第乙個元素(實測)

priority_queue,vector>,

greater>> costminheap;

//使用自定義比較函式,必須把cmp寫成仿函式形式,然後預設引數必須補齊

priority_queue,vector>,cmp> profitmaxheap;

for(int i=0;i

做專案的最大收益

輸入 引數1,正數陣列costs 引數2,正數陣列profits 引數3,正數k 引數4,正數m costs i 表示i號專案的花費 profits i 表示i號專案在扣除花費之後還能掙到的錢 利潤 k表示你不能並行 只能序列的最多 做k個專案 m表示你初始的資金 說明 你每做完乙個專案,馬上獲得的...

最大收益問題

time limit 2000ms memory limit 65536k 有疑問?點這裡 鐵牌狗最近迷上了一款遊戲,但鐵牌狗實在是太笨了,他還是要請求你的幫助。有乙個n行m 列的矩陣 a,矩陣 a中每個數字均為正整數,現在鐵牌狗要在其中選出乙個r行 c列的子矩陣 b,這個子矩陣 b中各個數字之和即...

Isap 最大收益問題

永樂理工大學的實驗室計畫了一系列實驗專案,這些實驗專案需要不同的實驗儀器,而配置儀器需要費用,但實驗也會產生經濟效益。請設計乙個演算法,如何才能有最大淨收益?模型歸納為二分圖匹配模型,假設實驗專案為e 儀器為,那麼假設配置儀器的費用使用ci表示,經濟收益用pi表示,那麼,我們利用二分圖實現該問題,首...