当前位置: 代码迷 >> 综合 >> 洛谷 P4053 [JSOI2007]建筑抢修(贪心)
  详细解决方案

洛谷 P4053 [JSOI2007]建筑抢修(贪心)

热度:18   发布时间:2024-02-20 08:36:20.0

贪心
网上老哥的思路:
先按从小到大排序,考虑每一个建筑能否在前修好。
如果可以,就将当前时间加上。
如果不行,就在所有修好的建筑中找到一个最大的,并与当前的作比较,如果当前更小则替换成当前的建筑。
用一个堆来维护即可。

#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 */