这道题的量还是蛮大的
没用到什么技巧性东西
#include <iostream>
using namespace std;
int n,m,k,q;
int timec[1001]={0};//每个customer的业务时间
int query[1001]={0};
int starttime[1001]={0};//每个customer开始业务的时间
int endtime[1001]={0};//每个customer完成业务的时间
int endserve[21]={0};//每个窗口结束服务的时间
int startserve[21];
int serve[21][1001]={0};//每个窗口服务的customers
int serveNum[21]={0};//每个窗口服务的customers数量
void init(){
for(int i=1;i<=n;i++)
startserve[i]=1;
}
int nextOne(){
int least=timec[serve[1][startserve[1]]], num=1,i;
for(i=2;i<=n;i++){
if(least>timec[serve[i][startserve[i]]]){
least=timec[serve[i][startserve[i]]];
num=i;
}
}
startserve[num]++;
for(i=1;i<=n;i++){
if(i!=num)
timec[serve[i][startserve[i]]]-=least;
}
return num;
}
void serveline(){
int cust=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
serve[j][i]=++cust;
endserve[j]+=timec[cust];
endtime[cust]=endserve[j];
starttime[cust]=endtime[cust]-timec[cust];
serveNum[j]++;
if(cust==k)
return;
}
}
while(cust<k){
int win=nextOne();
serve[win][++serveNum[win]]=++cust;
endserve[win]+=timec[cust];
endtime[cust]=endserve[win];
starttime[cust]=endtime[cust]-timec[cust];
}
return;
}
int main()
{
int i;
cin>>n>>m>>k>>q;
for(i=1;i<=k;i++)
cin>>timec[i];
for(i=1;i<=q;i++)
cin>>query[i];
init();
serveline();
for(i=1;i<=q;i++){
if(starttime[query[i]]>=540)
cout<<"Sorry"<<endl;
else if(endtime[query[i]]<120){
cout<<"0"<<8+endtime[query[i]]/60<<":";
if(endtime[query[i]]%60>=10)
cout<<endtime[query[i]]%60<<endl;
else
cout<<"0"<<endtime[query[i]]%60<<endl;
}else{
cout<<8+endtime[query[i]]/60<<":";
if(endtime[query[i]]%60>=10)
cout<<endtime[query[i]]%60<<endl;
else
cout<<"0"<<endtime[query[i]]%60<<endl;
}
}
return 0;
}