2019-10-16

提不起做题的兴趣惹……磨磨蹭蹭写了一道还不是满分,不知道自己错哪也不想找哈哈哈哈

PAT A1014

排队问题,n个窗口,每个窗口可以排m个人,剩余的人在等候区,当某个窗口排队人数小于m时候补进去,优先选择序号小的窗口。银行从8:00到17:00营业,只要你在下班前排到,办理一万分钟都行,输出所给顾客办理完业务的时间,如果不能在下班前排上队,就输出sorry。
这题开始看着懵逼,但是想想逻辑也很简单,磨磨蹭蹭写了很久,(并不是满分)

#include<iostream>
#include<algorithm>
using namespace std;
int need[1005] = { 0 };//办理业务时间 min
int nn[1005] = { 0 };
int ed[1005][1005] = { 0 };
int st[1005]={0};

int main()
{
	int min = 999999;
	int kk = 0;
	int n, m, k, q;
	cin >> n >> m >> k >> q;
	int i, j, enq;

	for (i = 0; i<k; i++)
	{
		cin >> need[i];
		//cout << need[i] << endl;
	}

	for (i = 0; i<k; i++)
	{
		if (i<n)
		{
			ed[0][i] = need[i];
			nn[i] = need[i];
			//cout << nn[i] << endl;
		}
		else if (i >= n&&i<n*m)
		{
			st[i] = ed[i / n - 1][i%n];
			ed[i / n][i%n] = ed[i / n - 1][i%n] + need[i];
			nn[i] = ed[i / n][i%n];
			//cout << nn[i] << "************"<<endl;
		}
		else
		{
			nn[i] = need[i];
			//cout << need[i] << "^^^^^^" << endl;
			min = 9999; kk = 0;
			for (j = 0; j<n; j++)
			{
				if (ed[0][j]<min)//只考虑排队人数
				{
					min = ed[0][j];
					kk = j;
				}
			}
			//cout << "kk=" << kk << endl;
			for (j = 1; j<m; j++)
			{
				ed[j - 1][kk] = ed[j][kk];
			}
			ed[m - 1][kk] += need[i];
			st[i] = ed[m - 1][kk];
			nn[i] = ed[m - 1][kk];
		}
	}
	for (j = 0; j<q; j++)
	{
		cin >> enq;
		if (st[enq - 1] <=540&& 8 + nn[enq - 1] / 60<=17)
		{
			if (nn[enq - 1] / 60 < 2)
				cout << "0" << 8 + nn[enq - 1] / 60 << ":";
			else cout << 8 + nn[enq - 1] / 60 << ":";
			if (nn[enq - 1] % 60 < 10)
				cout << "0" << nn[enq - 1] % 60;
			else cout << nn[enq - 1] % 60;
		}
		else cout << "sorry";
		if (j<q - 1)
			cout << endl;
	}
	system("PAUSE");
	return 0;
}

然后接下来是别人的答案,思路一样……好烦找不同啊哈哈哈哈

#include<iostream>
#include <vector>
#include <queue>
using namespace std;


int N, M, K, Q;

int main()
{
    cin >> N >> M >> K >> Q;
    vector<queue<int>>windows(N);//N个窗口
    vector<int>endTime(K + 1);
    vector<bool>Sorry(K + 1, false);//若前面那个人的业务办理时间超过下班时间,那么你是排不上的
    int a, time;
    for (int i = 0; i < K; ++i)
    {
        cin >> a;
        if (i < N * M)//先将窗口的位子按序排满,存的是该人完成业务的时间
        {
            if (windows[i%N].size() > 0)
            {
                time = windows[i%N].back() + a;
                windows[i%N].push(time);
                Sorry[i + 1] = windows[i%N].back() >= 540 ? true : false;
            }
            else
            {
                time = a;
                windows[i%N].push(a);                
            }
        }
        else//线外的人选择窗口排队
        {
            int minTime = windows[0].front(), index = 0;
            for (int j = 1; j < N; ++j)//找到最先出现空位的窗口,然后去选择该窗口排队
            {
                if (minTime > windows[j].front())
                {
                    index = j;
                    minTime = windows[j].front();
                }
            }
            Sorry[i + 1] = windows[index].back() >= 540 ? true : false;
            time = windows[index].back() + a;
            windows[index].pop();//排完对队就离开
            windows[index].push(time);//排队
        }
        endTime[i + 1] = time;
    }

    for (int i = 0; i < Q; ++i)
    {
        cin >> a;
        time = endTime[a];
        if (Sorry[a])
            printf("Sorry\n");
        else
            printf("%02d:%02d\n", 8 + time / 60, time % 60);
    }
    return 0;
}

原文链接是:https://www.cnblogs.com/zzw1024/p/11191808.html
~~

发布了42 篇原创文章 · 获赞 16 · 访问量 2877

猜你喜欢

转载自blog.csdn.net/weixin_44412218/article/details/102585828