贪心
网上老哥的思路:
先按从小到大排序,考虑每一个建筑能否在前修好。
如果可以,就将当前时间加上。
如果不行,就在所有修好的建筑中找到一个最大的,并与当前的作比较,如果当前更小则替换成当前的建筑。
用一个堆来维护即可。
#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; //优先队列,维护 t1sort(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 */