题意:
从n栋楼里修楼 每栋楼有修理时间和截止时间 问最多能修多少栋楼
思路:
贪心是肯定的。我们先按结束时间排序,结束时间越早 你就可以干越多的事 其次按消耗时间排序 但是会存在性价比更高的方式 前面消耗时间太长 导致后面可以有更多的选项没有选到 采用开个堆 反悔贪心一手 如果我当下无法选择这个修这个楼 就看看前面的选择 有没有比当下选择消耗时间更多的 有的话明显当下的选择是更优的 替换一下 这样最终答案就是正确的
代码
#include <bits/stdc++.h> using namespace std; #define LL long long #define ULL unsigned long long #define mes(x, a) memset(x, a, sizeof(x)); #define sca(a) scanf("%d", &a) #define lowbit(x) x&(-x) #define mk make_pair #define pb(x) push_back(x) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define lson v << 1 #define rson v << 1 | 1 #define pii pair<int, int> const int N = 150005; struct node{ int x,t; }a[N]; bool cmp(node a,node b){ if(a.t != b.t){ return a.t < b.t; } return a.x < b.x; } priority_queue <int> q; int main(){ ios::sync_with_stdio(0); int n;cin >> n; for(int i = 1;i <= n;i ++){ cin >> a[i].x >> a[i].t; } sort(a + 1,a + 1 + n,cmp); LL time = 0; int res = 0; for(int i = 1;i <= n;i ++){ if(time + a[i].x <= a[i].t){ res ++ ; time += a[i].x; q.push(a[i].x); }else{ if(a[i].x < q.top()){ time -= q.top(); time += a[i].x; q.pop(); q.push(a[i].x); } } } cout << res << '\n'; return 0; }