題意是有n行任務,給出完成每項任務所需要的時間長度,求出完成所有任務所需要的最短時間.每個任務都會有乙個約束條件,就是在完成這項任務之前必須完成所列出的其它任務.可以同時做多項任務.簡單來說就像煮飯炒菜問題一樣,可以一邊燒飯一邊炒菜.但炒菜之前必先洗菜.
這道題我主要用了最小優先佇列,有點像dijktra, 列隊按兩個條件來維護, 首先是所按所需的條件(前任務)個數,這裡用need陣列儲存,然後按開始任務的時間. 用乙個need陣列維護每個任務所需的前任務個數,如果為0, 則丟進列隊裡, 每次取出列隊首元素, 即當前可以開始的任務, 將所有以這一任務為前提的任務的need減一,再更新一下start值(表示任務開始的時間). 若need為0,則丟進列隊裡,如此重複直到列隊為空, 再找出start裡最大值,再加上這個最大start值的任務的所需時間,即為完成所有任務所需的最短時間.
**
1#include
<
iostream
>
2#include
<
cstdio
>
3#include
<
string
>
4#include
<
cstring
>
5#include
<
vector
>
6#include
<
queue
>
7#include
<
algorithm
>89
using
namespace
std;
1011
const
intmaxn
=10001;12
const
intinf
=0x7f7f7f7f;13
14vector
<
int>
box[maxn];
15int
cost[maxn], start[maxn], need[maxn];
1617
void
init_input(
const
intn)
1832}33
}34void
clear(
const
intn)
3539
40class
comp
4150
};51
52int
solve(
const
intn)
5362}63
intans=0
;64while( !
que.empty() )
6578
if( need[
*ix] ==0
)79que.push(
*ix);
80++
ix;81}82
}83for(
inti=0
; i<
n; ++
i )84
87return
ans;88}
8990
intmain()
91102
return0;
103}
104
POJ1949 拓樸排序
拓樸排序 1 將入度為0的點入棧 2 while stack.empty node stack.top for each currentnode與node有邊 indegree currentnode 入度減一 poj1949在這裡儲存currentnode完成的時間,當然是貪心記錄最遲完成的時間 ...
最小堆,優先佇列
定義乙個list h crud 查詢 堆頂 最小 h 0 0 替換 heapq.heapreplace heap,key,value 參考鏈結 你打算每天 最多 吃乙個蘋果來保證營養均衡。注意,你可以在這 n 天之後繼續吃蘋果。示例 1 思路 模擬即可,堆中用key,value 儲存,保質期和蘋果個...
poj 2970 優先佇列
先按di排序,從小到大 然後依次完成合同,若發現第i個合同無法在截止日期前完成,便從之前已經完成的任務中選乙個aj最大的合同,付錢來使得這個合同盡快完成。include include include include include using namespace std struct node i...