题目详情 - 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);
}
}