专栏文章

P4053 [JSOI2007] 建筑抢修

P4053题解参与者 1已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@minorb1t
此快照首次捕获于
2025/12/02 05:53
3 个月前
此快照最后确认于
2025/12/02 05:53
3 个月前
查看原文
我的第一篇题解,写的不好多多包涵
AC记录:https://www.luogu.com.cn/record/238851833
先说思路:一开始想到了贪心再用数组维护,但是会超时,只能拿60分,看到一篇题解使用了优先队列,于是想到了贪心并动态数组维护,具体代码请看详细注释
代码:
CPP
#include<bits/stdc++.h>//万能头
using namespace std;
struct stu{ //定义结构体
	long long t1,t2; //修理耗时,结束时间
};
bool cmp(stu a, stu b){ 
	return a.t2<b.t2; //先报废的先修
}
long long n,f,ans;//建筑个数,当前时间,最多能抢修建筑个数
int main() 
{
    cin>>n;//输入
    vector<stu>a(n);
    vector<long long>v;//动态数组
    for(int i=0; i<n; i++) cin >>a[i].t1>>a[i].t2;//输入
    sort(a.begin(),a.end(),cmp);//按报废时间从早到晚排序
    for(int i=0; i<n; i++){ //开始判断
        if(f+a[i].t1<=a[i].t2){ //如果能修
            f+=a[i].t1; //当前时间加上维修时间
            v.insert(lower_bound(v.begin(),v.end(),a[i].t1),a[i].t1); //有序插入当前建筑维修时间
            ans++; //答案加一
        } 
		else if(!v.empty() && v.back()>a[i].t1){ //贪心(替换耗时更长的任务)
            f+=a[i].t1-v.back(); //更新当前时间
            v.pop_back(); //移除最长耗时的任务
            v.insert(lower_bound(v.begin(),v.end(),a[i].t1),a[i].t1); //插入新任务
        }
	}
    cout<<ans;//输出答案
    return 0;
}
完结撒花!!!

评论

1 条评论,欢迎与作者交流。

正在加载评论...