题意:
Note that since the bank is closed everyday after 17:00, for those customers who cannot be served before 17:00, you must output Sorry
instead.
这句话是重点啊喂,就因为没看清题,wa了好几发qwq,就是说顾客在17:00之前没被服务(不包括17:00)那就只能对他说Sorry喽,从样例中可以看出来,17:00的时候第6个顾客走了,第7个顾客正好在17点,但是不能被服务。
思路:
模拟队列,队列里存的是该队的顾客结束时间
每次判断每个队谁最先出来,pop(队首元素),然后让下一个人进去,push(这个人的结束时间)
注意:
1、时间处理都是先以分钟来算,最后输出时候再转换
2、日期输出:printf("%02d:%02d\n",h,m);
3、每次判断最小值的时候,mymin变量记得重新赋值
(好久不敲代码,手生了qwq)
代码入下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<set>
#include<queue>
#include<stack>
#include<sstream>
#define ll long long
using namespace std;
const int N=1006;
int tim[N];
int ans[N];
void print(int x,int it){
int h=x/60,m=x%60;
h+=8;
if(x-tim[it]>=9*60)printf("Sorry\n");
else {
printf("%02d:%02d\n",h,m);
}
}
queue<int>qqq[25];
int main(){
int n,m,k,q;
scanf("%d%d%d%d",&n,&m,&k,&q);
for(int i=1;i<=k;i++)scanf("%d",&tim[i]);
memset(ans,0,sizeof(ans));
for(int i=1;i<=m*n&&i<=k;i++){
if(i<=n)ans[i]=tim[i];
else ans[i]=ans[i-n]+tim[i];
if(i%n==0)qqq[n].push(ans[i]);
else qqq[i%n].push(ans[i]);
}
int p=m*n+1,pos,tmp;
if(k>m*n){
while(1){
int mymin=0x3f3f3f3f;
for(int i=1;i<=n;i++){
tmp=qqq[i].front();
if(tmp<mymin){
mymin=tmp;
pos=i;
}
}
ans[p]=qqq[pos].back()+tim[p];
qqq[pos].pop();
qqq[pos].push(ans[p]);
p++;
if(p>k)break;
}
}
int tt;
for(int i=1;i<=q;i++){
scanf("%d",&tt);
print(ans[tt],tt);
}
}