题目大意:n个建筑需要抢修,第i个建筑需要T[i]时间抢修,必须在e[i]时间之前抢修完毕,求最多能抢修多少建筑
题解:按结束时间升序排序,顺序扫描,维护一个堆。把每个建筑都扔进去,如果当前建筑没法修,就把堆顶的(用时最长的)扔掉,可以证明这样贪心是正确的
我的收获:套路贪心
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
priority_queue <int> q;
int n,s,now;
struct xx{
int v,e;
}a[150005];
bool cmp(xx a, xx b){
return a.e<b.e;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].v,&a[i].e);
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
s++;now+=a[i].v;q.push(a[i].v);
if(now>a[i].e){now-=q.top();q.pop();s--;}
}
cout<<s<<endl;
}