题意:
去银行办业务,有n个窗口,每个窗口前站m个人最多,有k个人来银行,q个询问
第二行是每个人办业务时间,q询问第i个人结束是几点。如果17.00才开始或者17.00之后才开始都算办不上,如果17.00之前开始在17.00之后结束算成功办理业务
思路:
队列维护,17.00的坎恶心啊。测试点最后两个卡我半个多小时
#include <iostream>
#include <queue>
#include <stdio.h>
#include <cstring>
using namespace std;
queue <int > a[25];
int main()
{
int vis[10000];
int st[10000];
int ov[10000];
int per[10000];
int time[10000];
memset(per,0,sizeof(per));
memset(time,0,sizeof(time));
memset(st,0,sizeof(st));
memset(vis,0,sizeof(vis));
memset(ov,0,sizeof(ov));
int n,m,k,q;
cin>>n>>m>>k>>q;
for(int i=0; i<k; i++)
{
cin>>per[i];
}
for(int i=0;i<k&&i<n*m;i++)
{
st[i]=ov[i%n];
ov[i%n]=st[i]+per[i];
a[i%n].push( ov[i%n] );
}
for(int i=n*m;i<k;i++)
{
int index=-1,minn=2e+9;
for(int j=0;j<n;j++)
{
if(a[j].front()<minn)
{
index=j;
minn=a[j].front();
}
}
st[i]=ov[index];
ov[index]=ov[index]+per[i];
a[index].push(ov[index]);
a[index].pop();
}
for(int i=1; i<=q; i++)
{
int ask;
cin>>ask;
ask--;
if(st[ask]>=540)
{
cout<<"Sorry"<<endl;
}
else
{
int hh=8+(st[ask]+per[ask])/60;
int mm=(st[ask]+per[ask])%60;
printf("%02d:%02d\n",hh,mm);
}
}
return 0;
}
/*
2 1 1 1
600
1
*/