队列的模拟题
我采用的做法,先将人能插进队列的就先插进队列,然后从中找到此时最小的花费,然后弹出队列,加入新的人。我一开始的时候错了两个测试的地方,第一个,并不是17:00后就没人在办理业务了,而是在17:00之前有受理这个业务,就需要把这个完成下去,所以对于有些数据来说是结束时间可以达到17:00以后的。第二个,错误原因在于思路上出现错误,我原本预想只用把当前所有队列中最短的那个弹出来就行了,但其实不然,弹出来的那个人所花费的时间其他的队列的人也花费了,所以需要把其他队列的花费值相应的减少,改正之后就AC了
#include<iostream>
#include<string>
#include<queue>
using namespace std;
#define maxn 1010
int N, M, K, Q;
int customer[maxn];
queue<int>myqueue[22];
int times[22];
int timing[maxn];
long long tt[22];
bool isin[maxn];
void insert(int t)
{
int pos = 22;
int minn = 0;
for (int i = 1; i <= N; i++)
{
if (times[i]>minn&×[i] != 0)
{
minn = times[i];
pos = i;
}
}
if (pos != 22)
{
myqueue[pos].push(t);
if (tt[pos] < 540)
isin[t] = true;
tt[pos] += customer[t];
timing[t] = tt[pos];
times[pos]--;
}
else
myqueue[21].push(t);
}
void solve()
{
int minn = 800;
int pos = 22;
while (!myqueue[21].empty())
{
minn = 800;
for (int i = 1; i <= N; i++)
{
int temp = myqueue[i].front();
if (customer[temp] < minn)
{
minn = customer[temp];
pos = i;
}
}
for (int i = 1; i <= N; i++)
{
int temp = myqueue[i].front();
if (i != pos)
{
customer[temp] -= customer[pos];
}
}
myqueue[pos].pop();
int temp = myqueue[21].front();
myqueue[pos].push(temp);
times[pos]--;
if (tt[pos] < 540)
isin[temp] = true;
tt[pos] += customer[temp];
timing[temp] = tt[pos];
myqueue[21].pop();
}
}
int main()
{
cin >> N >> M >> K >> Q;
//=-=血和泪的教训,要写成N而不是M。
for (int i = 1; i <= N; i++)
times[i] = M;
for (int i = 1; i <= K; i++)
{
cin >> customer[i];
insert(i);
}
solve();
int query;
for (int i = 1; i <= Q; i++)
{
cin >> query;
if (!isin[query])
cout << "Sorry" << endl;
else
{
int hour = timing[query] / 60;
if (hour < 2)
cout << "0" << hour+8 << ":";
else
cout << hour+8 << ":";
int minute = timing[query] % 60;
if (minute < 10&&minute>0)
cout << "0" << minute << endl;
else if (minute == 0)
{
cout << "00" << endl;
}
else
cout << minute << endl;
}
}
return 0;
}
本文介绍了一种使用队列模拟的算法实现方案,通过不断插入和弹出元素来模拟业务处理过程,解决特定场景下的资源分配问题。文章分享了解决过程中遇到的两个常见错误及修正方法,最终成功通过所有测试案例。
613

被折叠的 条评论
为什么被折叠?



