【题目描述】
今年是石室中学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;
}