贪心
网上老哥的思路:
先按从小到大排序,考虑每一个建筑能否在前修好。
如果可以,就将当前时间加上。
如果不行,就在所有修好的建筑中找到一个最大的,并与当前的作比较,如果当前更小则替换成当前的建筑。
用一个堆来维护即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int MaxN = 150010;
struct Build
{
int t1; // 修复时间
int t2; // 修好的最后期限
}b[MaxN];
int n;
bool cmp(Build a, Build b)
{
return a.t2 < b.t2;
}
void solve()
{
priority_queue<int> q; //优先队列,维护 t1
sort(b + 1, b + n + 1, cmp);
int tm = 0, cnt = 0;
for(int i = 1; i <= n; ++i)
{
if(tm + b[i].t1 <= b[i].t2)
{
++cnt;
tm += b[i].t1;
q.push(b[i].t1);
}else{
if(q.size() && q.top() > b[i].t1)
{
tm -= q.top();
q.pop();
tm += b[i].t1;
q.push(b[i].t1);
}
}
}
printf("%d\n", cnt);
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
{
scanf("%d%d", &b[i].t1, &b[i].t2);
}
solve();
return 0;
}
/*
4
100 200
200 1300
1000 1250
2000 3200
*/
/*
3
*/