先将M*N客户按序排队,同时计算每个客户的开始服务时间和结束服务时间,和每个队列的下一次服务时间。
之后每排一个客户,对队伍按下一次服务时间升序排序,将客户排入第一个队伍,计算其开始服务时间和结束服务时间,同时该队的下次服务时间加上一个队头客户的服务耗费时间。
注意!!是17:00以后才开始接受服务的客户输出sorry,若在17点之前开始接受服务,但结束时间超出17点,正常输出结束时间。
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <map>
#include <vector>
#include <queue>
using namespace std;
int N,M,K,Q;
struct line
{
int id;
vector<int> c;
int endtime;
int costtime;
int x;
}l[30];
struct customer
{
int starttime;
int endtime;
int cost;
}c[1010];
void init()
{
for(int i=0;i<N;i++)
{
l[i].endtime=0;
l[i].costtime=0;
l[i].id=i;
l[i].x=-1;
}
}
bool cmp(line a,line b)
{
if(a.costtime!=b.costtime)return a.costtime<b.costtime;
else return a.id<b.id;
}
void change(int time,int st)
{
if(st>=540)
{
printf("Sorry\n");
return;
}
int hour=8;
int minute=0;
while(time>=60)
{
time=time-60;
hour++;
}
minute=time;
printf("%02d:%02d\n",hour,minute);
}
int main()
{
scanf("%d%d%d%d",&N,&M,&K,&Q);
init();
int num=0;
for(num=0;num<M*N&&num<K;num++)
{
int index=num%N;
scanf("%d",&c[num].cost);
l[index].c.push_back(num);
c[num].starttime=l[index].endtime;
c[num].endtime=l[index].endtime+c[num].cost;
l[index].endtime+=c[num].cost;
l[index].x=0;
int dangqian=l[index].c[l[index].x];
l[index].costtime=c[dangqian].endtime;
}
while(num<K)
{
scanf("%d",&c[num].cost);
sort(l,l+N,cmp);
c[num].starttime=l[0].endtime;
c[num].endtime=l[0].endtime+c[num].cost;
l[0].endtime+=c[num].cost;
l[0].x++;
int dangqian=l[0].c[l[0].x];
l[0].costtime=c[dangqian].endtime;
l[0].c.push_back(num);
num++;
}
int que;
for(int i=0;i<Q;i++)
{
scanf("%d",&que);
change(c[que-1].endtime,c[que-1].starttime);
}
system("pause");
return 0;
}