没过,先存一下代码
题意:排队处理业务
思路:模拟队列,每秒处理一个任务
注意点:…..看了一下题解,发现自己理解错题意了…在17点前开始的业务都可以完成,所以时间有可能会超出17:00
还是在自己复杂的代码的基础上修改,有时间会重新写一下
#include<bits/stdc++.h>
using namespace std;
struct que{
vector<int>pel;
vector<int>index;
}q[20];
int ans[1005],ask[1005];
int main(){
int n,m,k,qe;
cin>>n>>m>>k>>qe;
for(int i=1;i<=k;i++){
cin>>ask[i];
}
memset(ans,-1,sizeof(ans));
//ans是对应下标顾客的开始服务时间
//先排队
int consumer=1;
for(int i=1,j=0;i<=k;i++,j=(j+1)%n,consumer++){
if((q[j].pel.size()==m)&&(j==0))
break;
// cout<<q[j].pel.size()<<endl;
if(q[j].index.size()==0){
ans[i]=0;
}else{
//前一个排队人的下标
int tmpindex=q[j].index[q[j].index.size()-1];
ans[i]=ans[tmpindex]+ask[tmpindex];
// cout<<ans[i]<<endl;
}
q[j].pel.push_back(ask[i]);
q[j].index.push_back(i);
}
//每秒做工
for(int i=1;i<=540;i++){
for(int j=0;j<n;j++){//每个队第一个人做工
if(q[j].pel.size()==0)
continue;
q[j].pel[0]= q[j].pel[0]-1;
if(q[j].pel[0]==0){//前一个人做完,再进入一个人
vector<int>::iterator it =q[j].pel.begin();
q[j].pel.erase(it);
it=q[j].index.begin();
int tmpindex = *it;
q[j].index.erase(it);
if(consumer<=k){//再进入一个人
if(q[j].index.size()==0){
ans[consumer]=ans[tmpindex]+ask[tmpindex];
}else{
//前一个排队人的下标
int frontindex=q[j].index[q[j].index.size()-1];
ans[consumer]=ans[frontindex]+ask[frontindex];
}
q[j].pel.push_back(ask[consumer]);
q[j].index.push_back(consumer);
consumer++;
}else{
continue;
}
}
}
}
for(int i=0;i<qe;i++){
int qer;
cin>>qer;
if(ans[qer]==-1||ans[qer]>=540)//不是在5点前
cout<<"Sorry\n";
else{
int hour=8+(ans[qer]+ask[qer])/60,mini=(ans[qer]+ask[qer])%60;
printf("%02d:%02d\n",hour,mini);
}
}
return 0;
}