醉了,题目没看清折腾了两个小时,线代落下了一个晚上的时间……
1014. Waiting in Line (30)
#include<iostream>
#include<queue>
#include<cstring>
#include<iomanip>
using namespace std;
const int maxn=1005;
const int inf=999999;
void print_time(int t)
{
int hh=0,mm=0;
while(1)
{
if(t>=60)
{
hh++; t-=60;
}
else
{
mm=t; break;
}
}
if(hh<2)
cout<<"0";
cout<<hh+8<<":";
if(mm<10)
cout<<"0";
cout<<mm<<endl;
}
int main()
{
int n,m,k,q;
int temp[3],question[maxn];
int time[maxn],ans[maxn],starttime[maxn],qcurtime[25];
while(cin>>n>>m>>k>>q)
{
queue<int> que[25];
memset(qcurtime,0,sizeof(qcurtime));
memset(ans,0,sizeof(ans));
for(int i=1;i<=k;i++)
cin>>time[i];
//先尽可能将队列装满
int i;
for(i=1;i<=k;i++)
{
temp[1]=inf; temp[2]=0;
for(int j=1;j<=n;j++)
{
if(que[j].size()<m && temp[1]>que[j].size())
{
temp[1]=que[j].size();
temp[2]=j;
}
}
if(temp[1]!=inf)
{
ans[i]=time[i]+qcurtime[temp[2]];
starttime[i]=qcurtime[temp[2]];
//cout<<"pre--ans["<<i<<"]="<<"time["<<i<<"]+qcurtime["<<temp[2]<<"]"<<"::: "<<ans[i]<<" = "<<time[i]<<" + "<<qcurtime[temp[2]]<<endl;
que[temp[2]].push(i);
qcurtime[temp[2]]+=time[i];
}
else
break;
}
if(i<=k)
for(;i<=k;)
{
//队满时,找到最先完成的顾客;令其出队
temp[1]=inf; temp[2]=0;
for(int j=n;j>=1;j--)
{
if(que[j].size()==m && temp[1]>ans[que[j].front()])
{
temp[1]=ans[que[j].front()];
temp[2]=j;
}
}
if(temp[2])
que[temp[2]].pop();
for(int j=n;j>=1;j--)
{
if(que[j].size()==m && temp[1]==ans[que[j].front()])
que[j].pop();
}
//找到最短未满队列,新顾客入队,记录当前队列完成时间
while(temp[2]!=0 && i<=k)
{
temp[1]=inf; temp[2]=0;
for(int j=1;j<=n;j++)
{
if(que[j].size()<m && temp[1]>que[j].size())
{
temp[1]=que[j].size();
temp[2]=j;
}
}
if(temp[2]!=0)
{
ans[i]=time[i]+qcurtime[temp[2]];
starttime[i]=qcurtime[temp[2]];
//cout<<"ans["<<i<<"]="<<"time["<<i<<"]+qcurtime["<<temp[2]<<"]"<<"::: "<<ans[i]<<" = "<<time[i]<<" + "<<qcurtime[temp[2]]<<endl;
que[temp[2]].push(i);
qcurtime[temp[2]]+=time[i];
i++;
}
}
}
for(i=1;i<=q;i++)
cin>>question[i];
for(i=1;i<=q;i++)
if(starttime[question[i]]<540)
print_time(ans[question[i]]);
else
cout<<"Sorry"<<endl;
}
}