随便说说:
这题写吐了,一开始题没读明白,后来又一直段错误,找了好久发现有个地方队列没判空,改的时候也优化了许多地方,弄了一上午终于过了555
思路:
记录每个人开始办业务的时间,上一个人走的时间加上他的开始时间就是下一个人的开始的时间,然后就是用队列模拟每一条队,输出的时候先判断他排上队的时间,然后加上他办理的时间,就是他走的时间。
Code:
#include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
const int N = 2010;
int num[N]; // 排上队的时间
string time(int t) // 0 - 540
{
string s;
t += 8 * 60;
s = t / 60 < 10 ? "0" + to_string(t / 60) : to_string(t / 60);
s += ":";
t %= 60;
s += t < 10 ? "0" + to_string(t) : to_string(t);
return s;
}
int main()
{
int n, m, k, Q; // 20 10 1000 1000
cin >> n >> m >> k >> Q;
vector<int> a(k + 1);
for (int i = 1; i <= k; i++)
{
cin >> a[i];
}
queue<int> q[25];
int t = 1;
for (int i = 1; i <= n * m && i <= k; i++)
{
if (t == n + 1) t = 1;
q[t].push(i);
t++;
}
for (int i = n * m + 1; i <= k; i++)
{
for (int i = 1; i <= n; i++)
{
if (q[i].size())
{
t = i;
break;
}
} // 找个不空的队列,作为判断的第一个队
for (int j = 2; j <= n; j++) // 找一个最早走的
{
if (q[j].empty()) continue; // 空的跳过,不然段错误
int x = q[j].front(), y = q[t].front();
if (num[x] + a[x] < num[y] + a[y])
{
t = j;
}
}
int x = q[t].front();
q[t].pop();
q[t].push(i);
num[q[t].front()] = num[x] + a[x];
}
bool flag = true;
while (flag)
{
flag = false;
for (int i = 1; i <= n; i++)
{
if (q[i].size())
{
t = i;
flag = true;
break; // 所有队都空了就结束了
}
}
if (!flag) break;
for (int j = 2; j <= n; j++) // 找一个最早走的
{
if (q[j].empty()) continue; // 防止段错误
int x = q[j].front(), y = q[t].front();
if (num[x] + a[x] < num[y] + a[y])
{
t = j;
}
}
int x = q[t].front();
q[t].pop();
if (q[t].empty()) continue; // 不同的是这里没有push了,所有人都有了自己的队
num[q[t].front()] = num[x] + a[x];
}
for (int i = 1; i <= Q; i++)
{
cin >> t;
if (num[t] < 540)
{
cout << time(a[t] + num[t]) << endl;
}
else
{
cout << "Sorry" << endl;
}
}
return 0;
}