UVA1422 Processor

二分答案+贪心

将任务从开始时间从小到大排序

因为r与d的范围小于20000

所以可以计算对于每个单位时间的最佳分配

记当前处理到时间 t,则将开始时间小于等于t的任务加入到堆中

贪心地让在堆中的任务结束早的先完成

如果仍未完成,则再次加入堆中

如果堆中任务的结束时间小于了当前时间或最后堆中仍有任务就判不可行

 1 #include
 2 using namespace std;
 3 
 4 int T, n, l, r, mid, eg = 1e7, nd;
 5 struct node {
 6     int r, d, w;
 7     bool operator <(const node &x) const {
 8         return x.d < d;
 9     }
10 } a[10005]; 
11 
12 bool check(int s) {
13     priority_queue  q;
14     while(!q.empty()) q.pop();
15     int top = 0;
16     for(int i = eg; i < nd; i++) {
17         while(a[top + 1].r <= i && top < n) {
18             top++;
19             q.push(a[top]);
20         }
21         int res = s;
22         while(res > 0 && !q.empty()) {
23             node now = q.top();
24             q.pop();
25             if(now.d <= i) return false;
26             if(now.w > res) {
27                 if(now.d <= i + 1) return false;
28                 now.w -= res;
29                 res = 0;
30                 q.push(now);
31                 break;
32             }
33             res -= now.w;
34         }
35     }
36     if(q.empty()) return true;
37     return false;
38 } 
39 
40 bool cmp(node a, node b) {
41     return a.r < b.r;
42 }
43 
44 int main() {
45     cin>>T;
46     while(T--) {
47         cin>>n;
48         for(int i = 1; i <= n; i++)
49             scanf("%d%d%d", &a[i].r, &a[i].d, &a[i].w), eg = min(eg, a[i].r), nd = max(nd, a[i].d);
50         sort(a + 1, a + n + 1, cmp);
51         l = 0, r = 1e9;
52         while(l < r) {
53             mid = (l + r)/2;
54             if(check(mid)) r = mid;
55             else l = mid + 1;
56         }
57         cout<endl;
58     }
59     return 0;
60 }

 

 

你可能感兴趣的:(UVA1422 Processor)