前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >uva_1422 Processor

uva_1422 Processor

作者头像
若羽
发布2019-07-15 16:35:17
2360
发布2019-07-15 16:35:17
举报
文章被收录于专栏:Code思维奇妙屋Code思维奇妙屋

题目链接

题意:

  有n个任务, 每个任务要在规定的时间[l, r]内完成, 工作量为 w, 每个任务可以分开完成。

  求, 使得所有任务都完成的最大速度的最小值。

思路:

  最大值最小问题, 二分。

  因为是要完成所有任务, 所以先按开始时间排序, 接下来二分速度。

  因为任意两个任务之间的关系只有两种, 1)相交或者包含 2)相切或者相离

  如果是情况 2) 那么不需要特殊处理, 按顺序处理过去即可。

  如果是情况 1) 那么需要将这个时间段内的任务按照结束时间来进行处理, 结束时间小的优先完成。

  然后枚举时间, 从1 开始处理过去, 看是否能处理完所有任务即可。

代码:

代码语言:javascript
复制
  1 #include <cmath>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <ctime>
  6 #include <set>
  7 #include <map>
  8 #include <list>
  9 #include <stack>
 10 #include <queue>
 11 #include <string>
 12 #include <vector>
 13 #include <fstream>
 14 #include <iterator>
 15 #include <iostream>
 16 #include <algorithm>
 17 using namespace std;
 18 #define LL long long
 19 #define INF 0x3f3f3f3f
 20 #define MOD 1000000007
 21 #define eps 1e-6
 22 #define MAXN 10010
 23 #define MAXM 100
 24 #define dd {cout<<"debug"<<endl;}
 25 #define pa {system("pause");}
 26 #define p(x) {printf("%d\n", x);}
 27 #define pd(x) {printf("%.7lf\n", x);}
 28 #define k(x) {printf("Case %d: ", ++x);}
 29 #define s(x) {scanf("%d", &x);}
 30 #define sd(x) {scanf("%lf", &x);}
 31 #define mes(x, d) {memset(x, d, sizeof(x));}
 32 #define do(i, x) for(i = 0; i < x; i ++)
 33 #define dod(i, x, l) for(i = x; i >= l; i --)
 34 #define doe(i, x) for(i = 1; i <= x; i ++)
 35 struct node
 36 {
 37     int l;
 38     int r;
 39     int t;
 40     int no;
 41     bool operator < (const struct node &y) const
 42     {
 43         return r > y.r;
 44     }
 45 };
 46 int n, sum;
 47 struct node f[MAXN];
 48 int w[MAXN];    
 49 bool cmp(const struct node &x, const struct node &y)
 50 {
 51     return x.l == y.l? x.r < y.r : x.l < y.l;
 52 }
 53 void read()
 54 {
 55     sum = 0;
 56     scanf("%d", &n);
 57     for(int i = 0; i < n; i ++)
 58     {
 59         scanf("%d %d %d", &f[i].l, &f[i].r, &f[i].t);
 60         sum += f[i].t;
 61         f[i].no = i;
 62     }
 63     sort(f, f + n, cmp);
 64 }
 65 bool is_ok(int x)
 66 {
 67     priority_queue <struct node> Q;
 68     for(int i = 0; i < n; i ++)
 69         w[f[i].no] = f[i].t;
 70     int i = 0;
 71     int pos = 1;
 72     while(true)
 73     {
 74         while(i < n && f[i].l <= pos) Q.push(f[i ++]);
 75 
 76         int ts = x;
 77         while(!Q.empty() && ts)
 78         {
 79             struct node temp = Q.top();
 80 
 81             if(temp.r <= pos) return false;
 82 
 83             w[temp.no] -= ts;
 84             if(w[temp.no] > 0)
 85                 ts = 0;
 86             else if(w[temp.no] <= 0)
 87             {
 88                 ts = -w[temp.no];
 89                 Q.pop();
 90             }
 91         }
 92 
 93         if(i == n && Q.empty()) return true;
 94         pos ++;
 95     }
 96     return false;
 97 }
 98 int get_ans()
 99 {
100     int l = 1, r = sum;
101     while(l <= r)
102     {
103         int mid = (l + r) / 2;
104         if(is_ok(mid))
105             r = mid - 1;
106         else 
107             l = mid + 1;
108     }
109     return l;
110 }
111 
112 int main()
113 {
114     int T;
115     scanf("%d", &T);
116     while(T --)
117     {
118         read();
119         printf("%d\n", get_ans());
120     }
121     return 0;
122 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-10-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档