2023华为OD机试真题-打印文件(JAVA、Python、C++)

题目描述:

有5台打印机打印文件,每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的优先级,其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。

现在请你来模拟这5台打印机的打印过程。

输入描述:每个输入包含1个测试用例,每个测试用例第1行给出发生事件的数量 N (0 < N < 1000)。
接下来有 N 行,分别表示发生的事件。

共有如下两种事件:

1. "IN P NUM",表示有一个拥有优先级 NUM 的文件放到了打印机 P 的待打印队列中。(0 < P  <= 5, 0 < NUM <= 10);

2. "OUT P",表示打印机 P 进行了一次文件打印,同时该文件从待打印队列中取出。(0 < P <= 5)。

输出描述:

对于每个测试用例,每次"OUT P"事件,请在一行中输出文件的编号。如果此时没有文件可以打印,请输出"NULL"。
文件的编号定义为:"IN P NUM"事件发生第 X 次,此处待打印文件的编号为 X。编号从1开始。

补充说明:

 收起

示例1

输入:

7
IN 1 1
IN 1 2
IN 1 3
IN 2 1
OUT 1
OUT 2
OUT 2
输出:

3
4
NULL
说明:

示例2

输入:

5
IN 1 1
IN 1 3
IN 1 1
IN 1 3
OUT 1
输出:

2
 

#include
 
using namespace std;
 
typedef struct Event {
    int p;
    int t;
 
    Event(int p, int t) {
        this->p = p;
        this->t = t;
    }
} Event;
 
struct comp {
    bool operator()(Event o1, Event o2) {
        if (o1.p == o2.p)
            return o1.t > o2.t;
        return o1.p < o2.p;
    }
};
 
struct Node {
    priority_queue, comp> PQ;
};
 
void SplitString(string input, vector &output, const string &pattern)
{
    string::size_type pos;
    input += pattern;
    for (size_t i = 0U; i < input.size(); i++) {
        pos = input.find(pattern, i);
        if (pos < input.size()) {
            string temp = input.substr(i, pos - i);
            if ((temp != pattern) && (!temp.empty())) {
                output.push_back(temp);
            }
            i = pos + pattern.size() - 1;
        }
    }
}
 
int main()
{
    int n;
    cin >> n;
    vectorArray(15, * new Node());
 
    cin.ignore();
    int id = 1;
 
    for (int i = 0; i< n; i++) {
        string command;
        vector temp;
        getline(cin, command);
        SplitString(command, temp, " ");
        int index = stoi(temp[1]);
        if (temp[0] == "IN") {
            int p = stoi(temp[2]);
            Array[index].PQ.push(Event(p , id++));
        } else {
            if(Array[index].PQ.empty()) {
                cout << "NULL" <
n = int(input())
file = {x:[] for x in range(6)}
p = {x:[] for x in range(6)}
out = []
s = 0
for i in range(n):
    a = list(input().split())
    if a[0] == 'IN':
        s += 1
        file[int(a[1])].append(int(a[2]))
        p[int(a[1])].append(s)
    else:
        j = int(a[1])
        if file[j]:
            ans = max(file[j])
            b = 0
            for k in range(len(file[j])):
                if file[j][k] == ans:
                    b = k
                    break
            print(p[j][b])
            file[j].remove(file[j][b])
            p[j].remove(p[j][b])
        else:
            print('NULL')

你可能感兴趣的:(华为OD机试真题2023,java,c++,python,华为,算法)