zoukankan      html  css  js  c++  java
  • LA 4254 Processor 处理器 【二分 贪心 优先队列】

    题目链接:

      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
    ", ans);
    77     }
    78 
    79     return 0;
    80 }
  • 相关阅读:
    假如时光倒流,我会这么学习Java
    一位资深程序员大牛给予Java初学者的学习路线建议
    Java基础部分全套教程.
    假如时光倒流,我会这么学习Java
    Window Location对象
    Window Screen对象
    Window
    easyui datagrid 清除缓存方法
    easyui tree扩展tree方法获取目标节点的一级子节点
    JavaScript 对象
  • 原文地址:https://www.cnblogs.com/miaowTracy/p/4853612.html
Copyright © 2011-2022 走看看