社区讨论

反悔贪心 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 条回复,欢迎继续交流。

正在加载回复...