zoukankan      html  css  js  c++  java
  • bzoj 1029: [JSOI2007]建筑抢修 (优先队列)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1029

    思路: 按结束时间排序,优先选结束时间短的,选完后扔到优先队列里(大的优先),如果选到某个点不能在规定时间内完成,我们就将优先队列的队首元素与当前点所需时间比较下,如果队首元素所需时间大于当前点,那么就不选择队首元素,选择当前点。

    实现代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int M = 2e5+10;
    struct node{
        int x,y;
    }a[M];
    bool cmp(node a,node b){
        if(a.y == b.y) return a.x < b.x;
        return a.y < b.y;
    }
    priority_queue<int>q;
    int main(){
       int n;
       cin>>n;
       for(int i = 1;i <= n;i ++){
           cin>>a[i].x>>a[i].y;
       }
       sort(a+1,a+1+n,cmp);
       int now = 0,ans = 0;
       for(int i = 1;i <= n;i ++){
           if(now + a[i].x <= a[i].y){
               ans++;q.push(a[i].x);now += a[i].x;
           }
           else{
               int tp = q.top();
               if(tp > a[i].x){
                  q.pop();q.push(a[i].x); now -= tp-a[i].x;
               }
           }
       }
       cout<<ans<<endl;
    }
  • 相关阅读:
    图的m着色问题 (回溯搜索)
    部落卫队 (回溯搜索)
    子集和问题 (回溯搜索)
    有重复元素的排列问题
    分书 回溯搜索
    选择工作 回溯搜索
    Problem E 
    Problem B
    Problem A
    Problem A
  • 原文地址:https://www.cnblogs.com/kls123/p/10580864.html
Copyright © 2011-2022 走看看