for those customers who cannot be served before 17:00
for those customers who cannot be served before 17:00
for those customers who cannot be served before 17:00
看三遍......审题还是很重要的。_(:з)∠)_虽然被坑了无数次还是看漏哎。。。
还有就是最后一个测试点是测时间都相同的时候的时间。就是几个队列要同时出队。我单独做了判定一起出队。网上有很多思路非常清晰的解法。大家可以参考下。
我是模拟了整个过程。
……………………更新线……………………
可以参考大神的做法 : http://blog.csdn.net/sunbaigui/article/details/8656844
思路非常简单清晰
其实插入的过程可以更加简单,每次选取最先出来的人的那个窗口进行插入。
我自己写一直没有解决时间更新的问题,每次选的窗口有点不对。
那我们应该怎么办。。每次直接计算出完成服务的时间,然后模拟队列的过程,每次取队列首的离开时间来选取,这样就能选择正确的窗口。
………………………………………………………………
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
void printTime(int time) { //打印时间 输入按分钟为单位
int hours, minutes;
hours = time / 60 + 8;
minutes = time % 60;
printf("%02d", hours);
cout << ":";
printf("%02d", minutes);
cout << endl;
}
int MinTime(queue <int> *win,int N){ //找最短队列 N窗口数
int minI = 0;
int minSize = win[0].size();
for (int i = 0; i < N; i++) {
if (win[i].size() < minSize) {
minSize = win[i].size();
minI = i;
}
}
return minI;
}
int DeQueueTime(queue <int> *win,int N){ //最早出队的窗口 N窗口数
int minI = 0;
int minSize = win[0].front();
for (int i = 0; i < N; i++) {
if (win[i].front() < minSize) {
minSize = win[i].front();
minI = i;
}
}
for (int i = 0; i < N; i++) { //对相同时间出队的成员一起出队
if (win[i].front() == minSize) {
win[i].pop();
}
}
return minI;
}
int main() {
int N, M, K, Q; //N窗口数 M黄线内人数 K顾客数 Q查询人数
cin >> N >> M >> K >> Q;
vector <int> customer;//顾客所用时间
vector <int> checkList;//查询列表
queue <int> *win = new queue <int>[N];//窗口队列
int temp;
for (int i = 0; i < K; i++) {
cin >> temp;
customer.push_back(temp);
}
for (int i = 0; i < Q; i++) {
cin >> temp;
checkList.push_back(temp -1); //归0
}
int * time = new int[K]; //第K个顾客服务完成时间
int * timeIn = new int[K];//服务时间
int * winTime = new int[N];//窗口计时
for (int i = 0; i < N; i++) {
winTime[i] = 0;
}
for (int i = 0; i < K; i++) {
timeIn[i] = 0;
time[i] = 0;
}
for (int i = 0; i < K; i++) {
int tempw = MinTime(win,N);//找最优窗口
// cout << "i: " << i << " win: " << tempw << endl;
// cout << "True " << TrueTime << endl;
if (win[tempw].size() < M)
win[tempw].push(customer[i]);
else { //等出队
tempw = DeQueueTime(win, N);
win[tempw].push(customer[i]);
}
timeIn[i] = winTime[tempw];
winTime[tempw] += customer[i];
time[i] = winTime[tempw];
}
for (int i = 0; i < checkList.size(); i++) {
int tempT = timeIn[checkList[i]];
if (tempT < 540) {
printTime(time[checkList[i]]);
}
else
{
cout << "Sorry" << endl;
}
}
return 0;
}