2026暑假 [排队取餐] 题解
这道题其实可以看出就是一道模拟,先按照时间遍历一遍每个成员,
然后我使用了一个 vector 来存储当前在等待的人,在遍历的时候就看那些人在等待去加进 vector,
之后找到在等待中的资历最大的人,统计答案,
最后输出答案就成了。
代码 $\downarrow$
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ans;
bool b[100005],c[100005];
struct node
{
int id,ti,al;
}a[100005];
bool cmp(node x,node y)
{
if(x.al==y.al)return x.id<y.id;
return x.al<y.al;
}
signed main()
{
freopen("ii.in","r",stdin);
freopen("ii.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].al>>a[i].ti;
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
int ap=1,tm=a[1].al,lll=1,ooo=1;
while(ap<n)
{
int ppp=lll;
for(int i=lll+1;i<=n&&a[i].al<=tm+a[ap].ti;i++)
{
if(c[i]==1)continue;
b[i]=1;
ppp++;
}
int k1=0,k2=0x3f3f3f3f;
bool kop=0;
for(int i=ooo;i<=ppp;i++)
{
if(b[i]==1)
{
if(kop==0)
{
kop=1;
ooo=i;
}
k1=(k2>a[i].id)?i:k1;
k2=min(k2,a[i].id);
}
}
lll=ppp;
if(k1==0)
{
for(int i=ap+1;i<=n;i++)
{
if(c[i]==1)continue;
ap=i;
break;
}
tm=a[ap].al;
c[ap]=1;
continue;
}
ans=max(ans,tm+a[ap].ti-a[k1].al);
b[k1]=0;
c[ap]=1;
tm+=a[ap].ti;
ap=k1;
}
cout<<ans;
return 0;
}
( ^_^ )
浙公网安备 33010602011771号