題目:有n個任務,每個任務有三個引數ri,di,wi,表示任務i必須在[ri, di]內執行完,現有一台處理器,處理器執行的速度可以變化,速度為s時,乙個工作量為wi的任務執行的時間為w/s,任務不一定連續執行,現在要求求出處理器在執行過程中最大速度的最小值。
分析:首先一定是個二分,所以主要的地方在於check函式怎麼寫。假設某一時刻的速度為v,不難想到,如果貪心的選擇結束時間距離當前時刻最近的任務執行(這裡需要用到優先佇列),一定是最優的,並且這樣還可以避免浮點數運算。
ps:優先佇列使用
**如下:
#include
#include
#include
#include
#include
#define db double
using
namespace
std;
const
int maxn = 10000 + 10;
const
int inf = (int)1e9;
struct node
}a[maxn];
int n, mint, maxt;
priority_queueq;
bool cmp(node a, node b)
bool check(int var)
if (tmp.r <= tim) return
false;
if (tmp.w <= var) var -= tmp.w;
else }}
return q.empty();
}int main()
sort(a, a + n, cmp);
int l = 0, r = sumw, ans;
while (l <= r) else l = m + 1;
}printf("%d\n", ans);
}return
0;}
LA 4254 處理器(二分 貪心)
題意 有n個任務,每個任務有3個引數ri,di和wi,表示必須在時刻 ri,di 之內執行,工作量為wi。處理器的速度可以為任意值,任務不一定要連續執行,可以分成若干塊,求最大速度的最小值。思路 最大值的最小值問題可以考慮用二分法來做。這道題目怎麼判斷速度合法是關鍵,我們可以使用秒為單位來判斷。計算...
LA 4254 Processor 二分 貪心
acm icpc live archive 這道題搞了我兩天,最終還是搞出來了!很容易就可以發現這題是二分,不過二分後怎麼貪心就稍微有點難想了。貪心的方法其實很簡單,就是盡量先把結束的早的任務先盡早的完成了。如果在給定的處理器速度下不能完成所有任務,那麼這個速度就還不夠。我的方法是用線段樹填充盡量靠...
Processor 二分搜尋,優先佇列
題意 給出n個任務完成區間以及工作量,求出最快處理速度.思路 用二分搜尋匹配最優速度,其中還用到優先佇列輔助.列舉所有截止時間,在此時間內的都進隊,按照工作截止時間越早越先出隊,如果截止時間不及列舉的截止時間,則錯過 include include include include includeus...