description
給出n件單位時間任務,對於第i件任務,如果要完成該任務,需要占用[si, ti]間的某個時刻,且完成後會有vi的收益。求最大收益。
澄清:乙個時刻只能做一件任務,做乙個任務也只需要乙個時刻。
input
第一行乙個整數n,表示可供選擇的任務個數.
接下來的第二到第n+1行,每行三個數,其中第i+1行依次為si,ti,vi
output
輸出最大收益
sample input
輸入1:
1 1 1
1 1 2
輸入2:
1 1 5
2 2 3
1 2 4
輸入3:
1 2 10
2 3 10
3 4 10
4 5 10
1 1 5
5 5 6
sample output
輸出1:
樣例1解釋:
選擇第二個任務可以得到價值2。
輸出2:
樣例2解釋:
在第乙個時刻完成任務一,在第二個時刻完成任務三,這樣得到最大總價值9。
輸出3:
樣例3解釋:
時刻1完成第乙個任務,時刻2完成第二個任務,時刻3完成第三個任務,時刻4完成第四個任務,時刻5完成第六個任務,所得的總收益是10+10+10+10+6=46,為最大收益。
data constraint
在佔12%分數的資料中有n≤20。
在佔30%分數的資料中有n≤500。
在所有資料中,n≤5000,1≤si≤ti≤108,1≤vi≤108。
乙個顯然的錯誤解法:
貪心,按收益從大到小加區間,能加則加(這個是對的)
然後排序+維護左端點
但這樣會掛
在上面的基礎上加上堆維護右端點,每次把合法的區間右端點丟進去
每次取最小的右端點判斷是否合法
時間複雜度:o(n2log n)
因為帶了乙個log所以會t
考慮把log去掉
貪心加區間,每次加到x(x=si)上
如果和其它區間衝突,那麼帶乙個t更大的去x+1找
(因為無論如何都要帶乙個走,那麼肯定帶t更大的那個)
這樣做本質是匈牙利,因為有了上面的貪心就可以優化到o(n2)
#include
#include
#include
#include
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define max(a,b) (a>b?a:b)
#define min(a,b) (a#define len 10000007
using
namespace std;
int hash[len+1]
[2];
int n,i,j,k,l;
long
long ans;
struct type a[
5001];
inthash
(int t,
int s,
bool type)
bool
cmp(type a,type b)
bool
find
(int t,
int x)
if(a[t]
.y.y)}
elseif(
find
(t,x+1)
)return1;
return0;
}int
main()
最大收益問題
time limit 2000ms memory limit 65536k 有疑問?點這裡 鐵牌狗最近迷上了一款遊戲,但鐵牌狗實在是太笨了,他還是要請求你的幫助。有乙個n行m 列的矩陣 a,矩陣 a中每個數字均為正整數,現在鐵牌狗要在其中選出乙個r行 c列的子矩陣 b,這個子矩陣 b中各個數字之和即...
公司最大收益
一家家具公司生產桌子和椅子。現有113個單位的木材。每張桌子要使用20個單位的木材,售價是30元 每張椅子要用16個單位的木材,售價是20元。使用已有的木材生產桌椅 不一定要用光木材 最多可以賣多少錢?首先我們看這個問題,我們能發現這是乙個優化問題,是在某種約束條件下求目標的最優值。對於這個問題來說...
Isap 最大收益問題
永樂理工大學的實驗室計畫了一系列實驗專案,這些實驗專案需要不同的實驗儀器,而配置儀器需要費用,但實驗也會產生經濟效益。請設計乙個演算法,如何才能有最大淨收益?模型歸納為二分圖匹配模型,假設實驗專案為e 儀器為,那麼假設配置儀器的費用使用ci表示,經濟收益用pi表示,那麼,我們利用二分圖實現該問題,首...