有n個工作,已知每個工作需要的時間q[i]和截止時間d[i](必須在此前完成),最多能完成多少個工作?工作只能序列完成,第一項任務開始的時間不早於時刻0.這道題算比較難的貪心了。解法是維護乙個關於所有選擇的時間的大根堆。將所有工作按照截止時間排序(將二維問題轉化為一維問題),然後依次考慮每乙個工作。如果當前的總時間t,加上當前工作的時間t1,小於等於當前工作的截止時間d1,那麼直接把當前工作加入大根堆中。如果t+t1>d1,說明如果做這個工作,就超時了,所以要考慮該不該做這個工作的問題。如果t1《大根堆頂的時間,說明如果把前面的乙個工作消除掉,再做這個工作,時間能更短,我們當然選擇把這個工作壓到堆裡去。如果t1>大根堆頂,說明這個工作是不能替換的。
插一句:貪心真是一種玄學的東西。。很多時候貪心要跟著感覺走,因為根本證明不出來~~~~~
#include #include #include using namespace std;
const int maxn=8e5+5;
int t, n;
priority_queueq;
struct workw[maxn];
bool cmp1(work &x, work &y)}}
printf("%d\n", ans);
if (t) puts("");
}return 0;
}
紫書 習題8 12 UVa 1153(貪心)
本來以為這道題是考不相交區間,結果還專門複習了一遍前面寫的,然後發現這道題的區間是不是 固定的,是在乙個範圍內 滑動的 只要右端點不超過截止時間就ok。然後我就先考慮有包含關係的時候怎麼選,然後發現當兩個區間只能放乙個的時候時間更短而截 至時間更長的時候,顯然更優。然後我就試著每個區間放的時候後後面...
1153 道路遊戲
2009年noip全國聯賽普及組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解小新正在玩乙個簡單的電腦遊戲。遊戲中有一條環形馬路,馬路上有n 個機械人工廠,兩個相鄰機械人工廠之間由一小段馬路連線。小新以某個機械人工廠為起點,按順時針順序依次將這n 個機械人工廠編號為1 n...
hdoj 1153 解題報告
題目意思 有乙個城鎮,它的所有街道都是單行的,並且每條街道都是和兩個路口相連。同時已知街道不會形成迴路。你的任務是編寫程式求最小數量的傘兵,這些傘兵可以訪問 visit 所有的路口。對於傘兵的起始降落點不做限制。解題思路 這個題轉化成求dag圖的最小路徑覆蓋數 節點數 最大匹配數。其中求最大匹配是關...