• 2016级算法第六次上机-C.AlvinZH的学霸养成记II


    1032 AlvinZH的学霸养成记II

    思路

    中等题,贪心。

    所有课程按照DDL的大小来排序。

    维护一个当前时间curTime,初始为0。

    遍历课程,curTime加上此课程持续时间d,如果这时curTime大于此课程DDL,表示无法学习此课程,但是我们不减去此课程,而是减去用时最长的那门课程(优先队列队首,课时最长)。

    贪心:
    假设当前课程为B,被替换课程为A,则有A.d≥B.d,A.e≤B.e。既然curTime+A.d≤A.e,那么curTime+B.d≤B.e绝对成立,保证了B的合法性。
    替换之后可学习课程数量没变,但是curTime变小了,有可能可选择更多课程,局部最优策略。

    分析

    Time complexity : (O(nlog(n))).

    Space complexity: (O(n)).

    参考代码

    //
    // Created by AlvinZH on 2017/11/26.
    // Copyright (c) AlvinZH. All rights reserved.
    //
    
    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include <queue>
    using namespace std;
    
    int n;
    struct Course {
        int d, e;
    }C[100005];
    
    bool cmp(Course p, Course q) {
        return (p.e < q.e);
    }
    
    int main()
    {
        while(~scanf("%d", &n))
        {
            for(int i = 1; i <= n; i++)
                scanf("%d%d", &C[i].d, &C[i].e);
    
            sort(C+1, C+n+1, cmp);//按课程的DDL排序
    
            int curTime = 0;
            priority_queue<int> Q;
            for(int i = 1; i <=n; ++i) {
                curTime += C[i].d;
                Q.push(C[i].d);
                if(curTime > C[i].e) {
                    curTime -= Q.top();
                    Q.pop();
                }
            }
    
            printf("%d
    ", Q.size());
        }
    }
    
  • 相关阅读:
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    java自学
    java自学
    Java自学
    Java自学
    java自学
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8185354.html
Copyright © 2020-2023  润新知