zoukankan      html  css  js  c++  java
  • PAT甲级1014. Waiting in Line

    PAT甲级1014. Waiting in Line

    题意:

    假设银行有N个窗口可以开放服务。窗前有一条黄线,将等候区分为两部分。客户要排队的规则是:

    每个窗口前面的黄线内的空间足以包含与M个客户的一条线。因此,当所有N行都满时,
    所有的客户(和包括)(NM + 1)第一个将不得不等待在黄线后面的一行。
    每个客户将选择最短的行,以便在穿过黄线时等待。如果长度相同的两行以上,客户将始终选择数字最小的窗口。
    客户[i]将在T [i]分钟内处理他/她的交易。
    前N名客户被假定在上午8:00送达。
    现在给予每个客户的处理时间,您应该告诉客户完成业务的确切时间。

    例如,
    假设一个银行有2个窗口,每个窗口可能有两个人在黄线内等待。分别有1个,2个,6个,4个和3分钟的交易有5个客户等待交易。在上午08:00,客户1在window1服务,而客户2在window2服务。
    Customer3将在window1之前等待,customer4将在window2之前等待。客户5将等待黄线后面。

    在08:01,客户1完成,客户5进入窗口1之前的行,因为这条线似乎更短。 Customer2将在08:02,customer4在08:06,customer3在08:07离开,最后在08:10退出customer5。

    输入

    每个输入文件包含一个测试用例。每个案例以包含4个正整数的行开始:N(<= 20,窗口数),M(<= 10,黄线内每行的最大容量),K(<= 1000,客户数) ,和Q(<= 1000,客户查询数)。

    下一行包含K个正整数,
    这是K客户的处理时间。

    最后一行包含Q正整数,表示正在询问他们完成交易时间的客户。客户的编号从1到K.

    输出

    对于每个Q客户,他们的交易完成时间一行打印,
    格式为HH:MM,其中HH在[08,17]中,MM在[00,59]中。请注意,由于银行在17:00之后每天关闭,对于那些在17:00之前无法上门的客户,您必须输出“抱歉”。

    思路:

    用优先队列模拟排队。
    题目中有个地方需要注意,就是只要在17:00前到的都可以服务。包括17:00点。这个地方比较骚。
    另外在黄线内就不能移动了,无论你旁边的队伍是否已经空了。

    ac代码:

    C++

    // pat1014.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<cstring>
    #include<unordered_map>
    
    using namespace std;
    
    int cusk[1005];
    int win[22];
    
    struct custom {
    	int id;
    	int time;
    	int window;
    };
    
    struct customcmp {
    	bool operator()(const custom &a, const custom &b)
    	{
    		if (a.time != b.time)
    		{
    			return a.time > b.time;
    		}
    		else
    		{
    			return a.window > b.window;
    		}
    	}
    };
    
    int main()
    {
    	int n, m, k, q;
    	priority_queue<custom, vector<custom>, customcmp> queue;
    	memset(win, 0, sizeof(win));
    	memset(cusk, 0, sizeof(cusk));
    	cin >> n >> m >> k >> q;
    	for (int i = 1; i <= k; i++)
    	{
    		cin >> cusk[i];
    	}
    
    	for (int i = 0; i < m; i++)
    	{
    		for (int j = 1; j <= n; j++)
    		{
    			custom cus;
    			if (win[j] >= 540 || win[j] < 0)
    				win[j] = -1;
    			else
    				win[j] += cusk[i * n + j];
    			cus.id = i * n + j;
    			cus.time = win[j];
    			cus.window = j;
    			cusk[i * n + j] = win[j];
    			queue.push(cus);
    		}
    	}
    
    	int cur = n * m + 1;
    	while (cur <= k)
    	{
    		custom cc = queue.top();
    		custom cus;
    		queue.pop();
    		if (win[cc.window] >= 540 || win[cc.window] < 0)
    			win[cc.window] = -1;
    		else 
    			win[cc.window] += cusk[cur];
    		cus.id = cur;
    		cus.window = cc.window;
    		cus.time = win[cc.window];
    		cusk[cur] = win[cc.window];
    		queue.push(cus);
    		cur++;
    	}
    
    	int id,tempres;
    	while (q--)
    	{
    		cin >> id;
    		tempres = cusk[id];
    		if (tempres < 0) cout << "Sorry" << endl;
    		else
    		{
    			int hour = 8, minute = 0;
    			hour += tempres / 60;
    			minute += tempres % 60;
    			printf("%02d:%02d
    ", hour, minute);
    		}	
    	}
    
        return 0;
    }
    
    
    
  • 相关阅读:
    Path Sum II
    Convert Sorted Array to Binary Search Tree
    Construct Binary Tree from Inorder and Postorder Traversal
    Construct Binary Tree from Preorder and Inorder Traversal
    Maximum Depth of Binary Tree
    Binary Tree Zigzag Level Order Traversal
    Binary Tree Level Order Traversal
    Same Tree
    Validate Binary Search Tree
    Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/weedboy/p/7249254.html
Copyright © 2011-2022 走看看