PAT甲级:1014 Waiting in Line (30 分)

这篇博客介绍了一个C++编程题目,涉及到队列管理与优化。题目设定有n个队列,每个能站m个人,当队列满时,会形成新的队列。人们选择人最少的队列,如果人数相同则选择编号小的。博主通过结构体数组存储队列信息,根据队列长度和编号排序,并处理队列出队和入队的情况。在处理过程中,博主使用了优先队列和映射来跟踪队列状态。最后,对于查询服务时间的问题,博主给出了相应的代码实现和逻辑解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目详情 - 1014 Waiting in Line (30 分) (pintia.cn)

题意:题目的大意是有n个队列,每个队列只能站m个人。当人站满的时候,所有人自成一个队列,当有队列空出来的时候就让队首出队。而每个人对队列的选择遵循以下规则:

1、选人最少的

2、人数相同选编号最小的

要求输出他们得到服务的时间,当得到服务的时间超过17:00时就Sorry。

解析:大概方法就是用结构体数组存储每个编号的队列,然后根据队列的长度和编号进行相应的排序,当队列长度等于m时就要把剩余时间最短的那个出队(是所有队列中时间最短的那个)。如果用时间相等的,一起出队。之后在进行一次排序,根据题意进行队列选择。然后根据简单的计算可得最后的时间。

Code Segment:

#include<cstdio>
#include<algorithm>
#include<queue>
#include<map>
#include<utility>
using namespace std;
struct person{
    int i;
    queue<int> minute;
    int sum;
    int count;
}a[21];
int cmp(const person &a,const person &b)
{
    if(a.minute.size()==b.minute.size())
        return a.i<b.i;
    return a.minute.size()<b.minute.size();
}
int main()
{
    int n,k,m,q,i,minute,num,j,minn;
    map<int,pair<int,int>> l;
    scanf("%d%d%d%d",&n,&m,&k,&q);
    for(i=0;i<n;i++)
        a[i].i=i;
    for(j=1;j<=k;j++)
    {
        sort(a,a+n,cmp);
        scanf("%d",&minute);
        if(a[0].minute.size()>=m)
        {
            minn=a[0].minute.front();
            for(i=1;i<n;i++)
                minn=min(minn,a[i].minute.front());
            for(i=0;i<n;i++)
            {
                a[i].minute.front()-=minn;
                if(a[i].minute.front()==0)
                    a[i].minute.pop();
            }
            sort(a,a+n,cmp);
        }
        a[0].count=a[0].sum;
        a[0].sum+=minute;
        a[0].minute.push(minute);
        l[j]=make_pair(a[0].count,a[0].sum);
    }
    while(q--)
    {
        scanf("%d",&num);
        if(l[num].first>=540)
            printf("Sorry\n");
        else
            printf("%02d:%02d\n",l[num].second/60+8,l[num].second%60);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值