【欢乐赛】【优先队列】 蜀石经

【题目描述】  

今年是石室中学2160年校庆年。CCTV国家宝藏节目联合中国国家图书馆赠送给学校一份珍贵的礼物——蜀石经拓本的复制本,让蜀石经重回石室。

同学们听说了这个消息后,纷纷希望一睹真容。学校在校史馆展出了这件国宝,今天有N个同学去参观,排起了长龙。因为学习紧张时间宝贵,我们决定让这个同学登记自己的时间安排。你现在拿到了这份时间表,知道了对于第i个同学 他计划在ai时间来看到这件国宝,他的欣赏时间为ti,他在欣赏的时间段中其他到达的同学智能排队等待,当一个人欣赏完后,有多个同学在等待,就会让操行分高的学生先欣赏(一个人恰好在一个人欣赏完离开时到达也认为是在等待)。当然,如果一个时间点没有任何人在欣赏,但同时有多个人是同一时间到,也是按操行分最高的先欣赏。

请你计算出所有同学在队伍中等待的时间(即对于ii,等待时间为aiai到他开始欣赏的时间)的最大值

【输入】

输入的第一行包含N。

以下N行按操行分高到低的顺序给出了N(1<=N<=10^5)个同学的时间安排 。每行包含一个人的ai和ti。所有的ti为不超过10^4的正整数,所有的ai为不超过10^9的正整数。

【输出】

输出所人中的最长等待时间。

【样例输入】

5
25 3
105 30
20 50
10 17
100 10

【样例输出】

10

【提示】

样例解释

一共有5个人,第4个人最先到(时间10),他欣赏完(时间27)第1和3个人都到达了,由于第一个人操行分高,所以他先欣赏(第1个人等待了2个单位时间)他欣赏完(时间30)后,第3个人开始欣赏(一共等待了10个单位时间),他欣赏完后一直到时间100,第5个人到达(没有等待),第5个人欣赏的时候,第2个人也到,在5个单位时间后开始欣赏。所以最多等待的是第3个人。

分析:

放眼一看,并没有思路,不管了,先按到达时间排个序!

然后,这不优先队列吗?

只用按时间模拟,一个人欣赏完之后,将在等待的人入队,然后按操行分依次出队即可

代码:

然而楼主忘了优先队列怎么写,于是暴力枚举水过去了
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0;char ch=getchar();
	while(!isdigit(ch)) ch=getchar();
	while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	return x;
}
const int N=1e5+10;
int n,T[N],ans,xz;
struct node{
	int l,t,x;
}a[N];
int cmp(node a,node b){
	if(a.l==b.l) return a.x<b.x;
	return a.l<b.l;
}
int main(){
	n=read();
	for(int i=1;i<=n;i++){
		int s=read(),t=read();
		a[i].l=s;a[i].t=t;a[i].x=i;
	}
	sort(a+1,a+n+1,cmp);
	xz=a[1].l;
	for(int i=1;i<=n;i++){
		int k=i,s=i,mx=a[i].x;
		while(a[k].l<=xz&&k<=n){
			if(a[k].x<mx){
				mx=a[k].x;
				s=k;
			}
			k++;
		}
		swap(a[s],a[i]);
		T[i]=max(a[i].l,T[i-1])+a[i].t;
		ans=max(ans,T[i]-a[i].l-a[i].t);
		//cout<<a[i].x<<endl<<T[i]<<endl;
		xz=T[i];
	}
	cout<<ans;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值