給定兩個整數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表示,那麼,我們利用二分圖實現該問題,首...