题解 | #[JSOI2007]建筑抢修#

[JSOI2007]建筑抢修

https://ac.nowcoder.com/acm/problem/20154

思路:(可撤销贪心?)先按完成期限对建筑进行升序排序,优先选取完成期限较早的建筑,再用一个堆来维护每个建筑所需的完成时间,如果遍历到所需完成时间比堆顶小(因为此时完成期限为当前建筑中最大的值,此时pop掉堆顶的建筑可能可以让size更大(也就是最终答案))且新的所需时间加和不超过当前建筑完成期限的,则pop原堆顶并push新建筑的所需完成时间即可。

#include <bits/stdc++.h>
using namespace std;

const int Nmax = 2e5;
int n;
long long T_sum;
struct s{
    int d,T;
}a[Nmax];
priority_queue<int,vector<int>,less<int>> heap;
bool comp(s x,s y){    //期限按升序排序
    return x.d < y.d;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    cin>>n;
    for(int i = 1;i <= n;i++)
        cin>>a[i].T>>a[i].d;
    sort(a+1,a+1+n,comp);
    for(int i = 1;i <= n;i++){
        if((T_sum+a[i].T) <= a[i].d){
            heap.push(a[i].T);
            T_sum += a[i].T;
        }
        else{
            if(heap.top() >= a[i].T && (T_sum-heap.top()+a[i].T) <= a[i].d){
                T_sum -= heap.top();
                T_sum += a[i].T;
                heap.pop();
                heap.push(a[i].T);
            }
        }
    }
    cout<<heap.size();
    return 0;
}
全部评论

相关推荐

白火同学:先说结论,对于一份实习简历来说,整体还是挺不错的,技术深度和广度都到位,找到一份中小厂的实习没啥问题。 再说说能优化的点吧。 1、量化结果,项目中很多工作量化一下结果给面试官的感受会更直观一些,也能体现你对应用该项技术的理解(在众多技术为什么要用它,运行性能或者说开发效率往往是一大考虑指标;而不是说大家做这种功能都用它,所以我用它)。 2、突出亮点,项目中可以从“工作职责”择一些“个人亮点”另写一块,优先去写开发过程中遇到的xx问题,使用xx技术达到xx效果,针对性去写一些疑杂难的功能,能带出你个人思考和解决的过程。
点赞 评论 收藏
分享
这个简历还有救吗,考研失利了,完蛋蛋了
飞屋一号:放宽心,9爷就业还是轻轻松松的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务