社区讨论
反悔贪心 10pts 调了一天了 等一位好心人
P4053[JSOI2007] 建筑抢修参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @locdygfj
- 此快照首次捕获于
- 2023/10/30 12:14 2 年前
- 此快照最后确认于
- 2023/11/04 23:55 2 年前
CPP
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
#define oo 0x3f3f3f3f
#define OO 0x3f3f3f3f3f3f3f3f
#define LL long long
#define res register int
#define STP system("pause")
using namespace std;
const int N=2e5;
struct NODE{
LL l,dt;//工程用时 和 截止时间
bool operator<(const NODE &v) const {//重载运算符
if(l<v.l) return true;
else return false;
}
}node[N+5];
priority_queue<NODE> q;//优先队列,用时长的作为堆顶
int cmp(NODE x, NODE y) {
if (x.dt!=y.dt) return x.dt<y.dt;
else if(x.dt==y.dt) return x.l<y.l;
}
int main(){
std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i){
cin>>node[i].l>>node[i].dt;
}
sort(node+1,node+n+1,cmp);//排序,让node以截止时间靠前的先被扫描到
LL ddl=0,nw=0;//ddl代表当前达到最远的ddl,nw代表当前已被占用的时间
for(int i=1;i<=n;++i){
if(node[i].dt>ddl) ddl=node[i].dt;//更新ddl
if(ddl-nw>=node[i].l){//如果当前ddl下还可以塞下该工程,就塞
q.push(node[i]);
nw+=node[i].l;
}
else if(node[i].l<q.top().l){//如果不能塞下当前工程,看一下当前工程是否比堆顶用时更少,如果更少则代替之
nw+=(node[i].l-q.top().l);
q.pop();
q.push(node[i]);
}
}
cout<<q.size()<<'\n';//堆内的任务数就是答案
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...