写在前面
- 实现思路
- 结构体封装窗口数据
- 时间归一化(
统一为分钟,技巧性处理
) - S1. 计算、封装总窗口容量。
- 下标取余窗口个数,并初始化窗口的计数时间、出队时间(
结构体、完成时间数组
)
- S2. 循环封装剩余队列元素。
- 循环判断哪个窗口先存在出队元素,窗口插入元素需更新出队时间、结束时间(
结构体、完成时间数组
)
- S3. 循环打印
- 话痨时刻
- 针对题目,懵逼了很久(
间歇性脑短路
),,, - 度娘并没有给出好的答案,也可能博主太菜,,,
- 最后,该试题逻辑处理细节较多(时间切换、累计),较为耗费时间、精力(真实考试大概率挂掉)
测试用例
input:
2 2 7 5
1 2 6 4 3 534 2
3 4 5 6 7
output:
08:07
08:06
08:10
17:00
Sorry
样例示意图
- 一开始没看懂,惭愧
- 懵逼!琢磨半天没理顺题目
- 窗口模拟图
ac代码
#include <cstdio>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
int hh2mm(int h, int m)
{
return h*60+m;
}
struct Window
{
int endTime=hh2mm(8, 0), popTime=endTime;
queue<int> q;
} window[20];
int main()
{
int n, m, k, query_num, q_ele;
scanf("%d%d%d%d",&n,&m,&k,&query_num);
int finishTimes[k], dualTimes[k];
for(int i=0; i<k; i++) scanf("%d", &dualTimes[i]);
int inx = 0;
for(int i=0; i<min(n*m, k); i++)
{
window[inx%n].q.push(inx);
window[inx%n].endTime += dualTimes[inx];
if(inx<n) window[inx].popTime = dualTimes[inx];
finishTimes[inx] = window[inx%n].endTime;
inx++;
}
for(; inx < k; inx++)
{
int idx = -1, minPopTime = 1 << 30;
for(int i=0; i<n; i++)
{
if(window[i].popTime < minPopTime)
{
idx = i;
minPopTime = window[i].popTime;
}
}
Window& W = window[idx];
W.q.pop();
W.q.push(inx);
W.endTime += dualTimes[inx];
W.popTime += dualTimes[W.q.front()];
finishTimes[inx] = W.endTime;
}
for(int i=0; i< query_num; i++)
{
scanf("%d", &q_ele);
if(finishTimes[q_ele-1] - dualTimes[q_ele-1] >= hh2mm(17, 0))
printf("Sorry");
else
printf("%02d:%02d", finishTimes[q_ele-1]/60, finishTimes[q_ele-1]%60);
if(i<query_num-1) printf("\n");
}
}