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;
}

 

posted @ 2019-03-22 20:52  冥想选手  阅读(112)  评论(0编辑  收藏  举报