题目链接:

  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21663


二分:

  最大值最小的问题通过二分来求解。对处理器速度进行二分之后,问题就转化成了对于给定的处理速度,问处理器是否可以将这些问题处理完。

贪心:

  一个贪心的思路就是每个时刻应该尽量 做可以做的任务中,结束时间最早的那个,这样最起码不会使结果更糟。这样就可以枚举每个单位时间,然后去找可以做的并且结束时间最早的那个去做,直到用完这一单位时间或者无任务可做为止。最后如果发现哪个任务还没做完,就说明在这个给定的处理速度下,处理器是不能完成所有任务的。

优先队列:

  总体的思路就是,将所有任务按照开始时间排序,二分枚举处理器的速度,然后对每个速度进行判断。按照任务开始时间依次加入优先队列,队列优先级是结束时间早的优先。最后就能判断该速度是否能够执行完所有任务。


 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<string>
 7 #include<vector>
 8 #include<set>
 9 #include<queue>
10 #include<map>
11 #include<stack>
12 using namespace std;
13 #define clr(c) memset(c, 0, sizeof(c));
14 const int INF = 0x3f3f3f3f;
15 typedef long long ll;
16 typedef unsigned long long ull;
17 typedef struct Job{
18     int l, r, w;
19     bool operator < (const Job& j) const{ // 用于优先队列内部排序
20         return r > j.r; // r大的优先级低,优先队列先输出优先级大的成员
21     }
22     bool operator > (const Job& j) const{
23         return j < *this;
24     }
25 }Job;
26
27 bool cmp(Job j1, Job j2){ // 用于sort函数
28     return j1.l < j2.l; // 当返回true时表示比较结果符合要求,不需要交换位置
29 }
30 const int MAXL = 10005;
31 Job J[MAXL];
32 int T, n, Begin, End, MaxS, l, r, mid, ans;
33 bool Ok(int speed){
34     priority_queue<Job> Q;
35     int pos = 0;
36     for(int i = Begin; i <= End; i++){
37         int time = speed;
38         while(J[pos].l < i && pos < n) Q.push(J[pos++]);
39         while(!Q.empty() && time != 0){
40             Job Jtemp = Q.top();
41             Q.pop();
42             if(Jtemp.r < i) return false; // 此时已经过了任务的执行期限, 说明此速度不能完成执行任务
43             if(Jtemp.w > time){
44                 Jtemp.w -= time;
45                 time = 0;
46                 Q.push(Jtemp); // 执行一部分任务,此任务未完成部分重新入队
47             }
48             else time -= Jtemp.w; // 此任务执行完毕, 利用剩余时间执行下一任务
49         }
50     }
51     if(Q.empty()) return true;
52     else return false;
53 }
54
55 int main(){
56     scanf("%d", &T);
57     while(T--){
58         Begin = INF, End = 0, MaxS = 0;
59         scanf("%d", &n);
60         for(int i = 0; i < n; i++){
61             scanf("%d%d%d", &J[i].l, &J[i].r, &J[i].w);
62             Begin = min(Begin, J[i].l); // 所有任务的最早开始时间
63             End = max(End, J[i].r); // 所有任务的最晚结束时间
64             MaxS += J[i].w; // 最大速度:在1个单位时间内所有任务都要完成,则速度必须大于等于所有任务的工作量的和
65         }
66         sort(J, J+n, cmp);
67         l = 0, r = MaxS, ans = INF;
68         while(l <= r){ // 二分
69             mid = (l + r) >> 1; //  (l + r) / 2;
70             if(Ok(mid)){
71                 r = mid -1; // 寻找所有符合要求的速度里面最小的那个
72                 ans = min(ans, mid);
73             }
74             else l = mid + 1; // 当前速度不符合要求的话,就必须加大速度
75         }
76         printf("%d\n", ans);
77     }
78
79     return 0;
80 }

转载于:https://www.cnblogs.com/miaowTracy/p/4853612.html

LA 4254 Processor 处理器 【二分 贪心 优先队列】相关推荐

  1. UVALive 4254 Processor(二分)

    很容易想到二分,问题在与判断一个解的可行性.贪心,时间点最多两万,可以模拟每个时间点,将事件按开始时间排序, 每次优先选已经开始了的且结束时间最早的任务来做,如果某个任务在deadline之前还没有结 ...

  2. 蒟蒻的第一篇博客CF1041C Coffee Break(二分+贪心+set)

    CF1041C Coffee Break(二分+贪心+set) 描述 Recently Monocarp got a job. His working day lasts exactly mm min ...

  3. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  4. 1163 最高的奖励(贪心+优先队列)

    有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突 ...

  5. 贪心+优先队列 HDOJ 5360 Hiking

    题目传送门 1 /* 2 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 3 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小, ...

  6. 洛谷P1182 数列分段 Section II(二分+贪心)

    题目描述 对于给定的一个长度为N的正整数数列 A1∼NA _{1∼N}A1∼N​,现要将其分成 M(M≤N)M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一 ...

  7. 贪心(优先队列) - New Year Snowmen - CodeForces - 140C

    贪心(优先队列) - New Year Snowmen - CodeForces - 140C 题意: 给定一个长度为n的正整数序列a1,a2,...,an.给定一个长度为n的正整数序列a_1,a_2 ...

  8. CodeForces 140C New Year Snowmen (贪心+优先队列)

    题意:n个数,选三个严格下降的数为一组,求最多能选多少组,并列出每组哪些数. 题解:贪心+优先队列 最多能选多少组,那么必须贪心数量多的. 例如:1 1 2 3 4 5 如果按照数的大小排序,只能贪到 ...

  9. CF140C New Year Snowmen(贪心+优先队列)

    CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...

最新文章

  1. 金环(2017佛山市选拔初中组)
  2. jQuery选择元素
  3. maven本地库已经有的包了,如何不下载(linux环境)
  4. 高效研发运维体系构建的流程和方法论
  5. Vision Transformer太火!这门开源课也火了!十小时现场coding带你玩转ViT 爆款SOTA算法!...
  6. ECCV 2020 | 清华提出基于循环关联的自监督行人再识别, 无标签ReID仅需两个摄像头!...
  7. Eclipse / Intellij Idea配置Git+Maven+Jetty开发环境
  8. 如何查看光驱硬盘托架的尺寸_「二次利用」没想到废光驱电机还可以这样利用...
  9. 计算两个日期之间相差的天数(带带负数) 支持格式YYYY-mm-dd和YYYY-mm-dd HH:mm:ss...
  10. Vmware虚拟机的linux与主机共享
  11. CentOS安装MySQL问题汇总
  12. 数字孪生将这样改变我们的工作与生活
  13. Ubuntu NumPy 安装
  14. 忆亚强建筑预算软件的2001年半年时光
  15. 实验二 贪吃蛇游戏的开发
  16. vue中watch不触发、不生效的解决办法及原理
  17. 数学建模常用算法—优劣解距离法(TOPSIS)
  18. 如何避免搜索引擎爬虫产生的流量过大以及搜索引擎设置优化
  19. Windows配置互联网访问检测服务器-IspSrv
  20. [lua] 用lua实现扑克游戏发牌的逻辑代码

热门文章

  1. 平滑线反锯齿工具_PS大神常用选框类工具有哪些?其实很简单,小白认真学也能懂...
  2. 剑指Offer #04 重建二叉树(递归)
  3. 五邑大学数据结构邢润丹实验_哪个大学楼最高:全国大学高楼海拔高度排名
  4. vc 只有顶级窗口可以弹出窗口_如何在Mac上允许弹出窗口
  5. Windows组策略让你的网络系统更强壮
  6. SpringCloud 应用在 Kubernetes 上的最佳实践 — 诊断(线上联调)
  7. android 活动外的类,Android – 活动外的startActivityForResult?
  8. 小程序f2自定义html,微信小程序个人产品添加上传样式设计制作开发教程(2)
  9. oracle中各种函数,oracle中常用函数大全
  10. 多节锂电串联保护板ic_BMS电池管理系统与锂电池保护板的区别