开始对于题意的理解有问题,最后一句说不能在17点之前包括17点接受服务的才输出sorry,而不是在17点之前不能结束服务才输出sorry
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>wintoid[25];
int N, M, K, Q;
int process[1010], query[1010], idtowin[1010], wintime[1010] = { 0 };
void init()
{
int now = 1,window=1;
for (int i = 1; i <= M&&now<=K; i++)
{
for (int j = 1; j <= N&&now<=K; j++)
{
wintoid[j].push_back(now);
idtowin[now] = j;
if (i == 1) wintime[j] = process[now];
now++;
}
}
}
int main()
{
scanf("%d%d%d%d", &N, &M, &K, &Q);
for (int i = 1; i <= K; i++) scanf("%d", &process[i]);
for (int i = 1; i <= Q; i++) scanf("%d", &query[i]);
init();
if (N*M < K)
{
int p ;
int num[25];//记录wintoid数组的第几个元素
fill(num,num+25,1);//由于vector从0开始,这里从第一个开始累加
for (int i = N * M + 1; i <= K; i++)
{
int min = 1e4;
for (int j = 1; j <= N; j++)//筛选所有窗口第一个时间最短的
{
if (wintime[j] < min)
{
min = wintime[j];
p = j;
}
}
wintoid[p].push_back(i);
idtowin[i] = p;
wintime[p] += process[wintoid[p][num[p]++]];
}
}
//处理query
for (int i = 1; i <= Q; i++)
{
int totaltime = 0;
int winid = idtowin[query[i]];
for (int j=0;j<wintoid[winid].size();j++)
{
totaltime += process[wintoid[winid][j]];
if (wintoid[winid][j] == query[i])
{
int servetime = totaltime - process[wintoid[winid][j]];
int sh = servetime / 60;
int sm = servetime % 60;
int h = totaltime / 60;
int m = totaltime % 60;
if (8 + sh >= 17) printf("Sorry\n");
else printf("%02d:%02d\n", 8 + h, m);
break;
}
}
}
return 0;
}