POJ3190 Stall Reservations 貪心
阿新 • • 發佈:2018-06-02
targe 程序 int print 一段時間 AI IV 關鍵字 cst
這是個典型的線程服務區間模型。一些程序要在一段時間區間上使用一段線程運行,問至少要使用多少線程來為這些程序服務?
把所有程序以左端點為第一關鍵字,右端點為第二關鍵字從小到大排序。從左向右掃描。處理當前區間時,提取出所有線程中最後一個被服務中的區間中右端點最小的區間(可用小根堆實現),若當前區間左端點值大於提取出的區間的右端點的值,則把當前區間安排到選中的區間的那個線程,否則只能再派出一個線程來負責該區間了。
此貪心是正確的,因為正在被服務中的區間中右端點最小的區間,能使當前區間不被該線程負責的當前區間左端點範圍最小。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int MAX_RANGE_CNT = 50010; struct Line { int End, Id; bool operator < (const Line a) const { return End > a.End; } Line() {} Line(int id, int end):Id(id),End(end){} }; priority_queue<Line> Heap; struct Range { int L, R, TargetLineId; }_ranges[MAX_RANGE_CNT], *_sortedRanges[MAX_RANGE_CNT]; bool cmp(Range *a, Range *b) { if (a->L != b->L) return a->L < b->L; else return a->R < b->R; } int main() { int rangeCnt; scanf("%d", &rangeCnt); for (int i = 1; i <= rangeCnt; i++) scanf("%d%d", &_ranges[i].L, &_ranges[i].R); for (int i = 1; i <= rangeCnt; i++) _sortedRanges[i] = _ranges + i; sort(_sortedRanges + 1, _sortedRanges + rangeCnt + 1, cmp); int lineCnt = 0; for (int i = 1; i <= rangeCnt; i++) { Range *cur = _sortedRanges[i]; if (!Heap.empty() && Heap.top().End < cur->L) { Line prev = Heap.top(); cur->TargetLineId = prev.Id; Heap.pop(); Heap.push(Line(prev.Id,cur->R)); } else { lineCnt++; cur->TargetLineId = lineCnt; Heap.push(Line(lineCnt, cur->R)); } } printf("%d\n", lineCnt); for (int i = 1; i <= rangeCnt; i++) printf("%d\n", _ranges[i].TargetLineId); return 0; }
POJ3190 Stall Reservations 貪心