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;
}

( ^_^ )

posted on 2026-07-18 09:54  hyh0926  阅读(12)  评论(0)    收藏  举报