PAT Advanced 1014

本文介绍了一种使用队列模拟的算法实现方案,通过不断插入和弹出元素来模拟业务处理过程,解决特定场景下的资源分配问题。文章分享了解决过程中遇到的两个常见错误及修正方法,最终成功通过所有测试案例。

队列的模拟题

我采用的做法,先将人能插进队列的就先插进队列,然后从中找到此时最小的花费,然后弹出队列,加入新的人。我一开始的时候错了两个测试的地方,第一个,并不是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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值