中国专业做鞋子的网站,诸暨公司网站建设,管理咨询公司简介,王也的口头禅题目描述:
有5台打印机打印文件#xff0c;每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分#xff0c;所以队列中的文件有1~10不同的优先级一#xff0c;其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优…题目描述:有5台打印机打印文件每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分所以队列中的文件有1~10不同的优先级一其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件则选择最早进入队列的那个文件。现在请你来模拟这5台打印机的打印过程。输入描述:每个输入包含1个测试用例一每个测试用例第1行给出发生事件的数量N(ON 1000)。接下来有N行分别表示发生的事件。共有如下两种事件:1.N PNUM表示有一个拥有优先级NUM的文件放到了打印机Р的待打印队列中。(0P 5,0NUM 10);2.OUTP表示打印机Р进行了一次文件打印同时该文件从待打印队列中取出。(0P 5)。输出描述:对于每个测试用例每次OUTP事件请在一行中输出文件的编号。如果此时没有文件可以打印请输出NULL。文件的编号定义为:IN PNUM事件发生第×次此处待打印文件的编号为x。编号从1开始。示例1输入:7IN 1 1IN 1 2IN 1 3IN 21OUT 1OUT 2OUT 2输出:34NULL解题思路需要模拟5台打印机的打印队列处理两种事件文件入队IN和打印出队OUT。对于OUT事件需要从指定打印机的队列中取出优先级最高的文件数字越大优先级越高优先级相同时选择最早入队的文件。关键步骤数据结构选择每台打印机使用一个优先队列或普通队列排序来管理文件队列中的元素需要记录文件的编号和优先级。事件处理根据输入的事件类型分别处理IN事件将文件加入对应打印机的队列并记录文件编号。OUT事件从对应打印机的队列中取出优先级最高的文件或NULL。优先级处理在队列中优先级高的文件先出队优先级相同时先入队的先出队。代码实现C 实现使用优先队列priority_queue自定义排序规则#include iostream #include queue #include vector using namespace std; struct File { int id; int priority; int seq; // 入队顺序 }; struct Compare { bool operator()(const File a, const File b) { if (a.priority ! b.priority) { return a.priority b.priority; } return a.seq b.seq; } }; int main() { int N; cin N; vectorpriority_queueFile, vectorFile, Compare printers(5); int fileId 1; for (int i 0; i N; i) { string op; cin op; if (op IN) { int p, num; cin p num; printers[p - 1].push({fileId, num, fileId}); fileId; } else if (op OUT) { int p; cin p; if (!printers[p - 1].empty()) { File file printers[p - 1].top(); printers[p - 1].pop(); cout file.id endl; } else { cout NULL endl; } } } return 0; }Python 实现使用堆heapq模拟优先队列import heapq class File: def __init__(self, id, priority, seq): self.id id self.priority priority self.seq seq def __lt__(self, other): if self.priority ! other.priority: return self.priority other.priority return self.seq other.seq def main(): N int(input()) printers [[] for _ in range(5)] file_id 1 for _ in range(N): op input().split() if op[0] IN: p int(op[1]) - 1 num int(op[2]) heapq.heappush(printers[p], File(file_id, num, file_id)) file_id 1 elif op[0] OUT: p int(op[1]) - 1 if printers[p]: file heapq.heappop(printers[p]) print(file.id) else: print(NULL) if __name__ __main__: main()Java 实现使用PriorityQueue自定义排序import java.util.*; class File { int id; int priority; int seq; public File(int id, int priority, int seq) { this.id id; this.priority priority; this.seq seq; } } public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int N sc.nextInt(); PriorityQueueFile[] printers new PriorityQueue[5]; for (int i 0; i 5; i) { printers[i] new PriorityQueue((a, b) - { if (a.priority ! b.priority) { return b.priority - a.priority; } return a.seq - b.seq; }); } int fileId 1; for (int i 0; i N; i) { String op sc.next(); if (op.equals(IN)) { int p sc.nextInt() - 1; int num sc.nextInt(); printers[p].add(new File(fileId, num, fileId)); fileId; } else if (op.equals(OUT)) { int p sc.nextInt() - 1; if (!printers[p].isEmpty()) { File file printers[p].poll(); System.out.println(file.id); } else { System.out.println(NULL); } } } } }JavaScript 实现使用数组模拟优先队列class File { constructor(id, priority, seq) { this.id id; this.priority priority; this.seq seq; } } function main() { const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout, }); let N; const printers Array.from({ length: 5 }, () []); let fileId 1; let lineCount 0; rl.on(line, (line) { if (lineCount 0) { N parseInt(line); lineCount; } else { const parts line.split( ); const op parts[0]; if (op IN) { const p parseInt(parts[1]) - 1; const num parseInt(parts[2]); printers[p].push(new File(fileId, num, fileId)); fileId; } else if (op OUT) { const p parseInt(parts[1]) - 1; if (printers[p].length 0) { printers[p].sort((a, b) { if (a.priority ! b.priority) { return b.priority - a.priority; } return a.seq - b.seq; }); const file printers[p].shift(); console.log(file.id); } else { console.log(NULL); } } lineCount; if (lineCount N) { rl.close(); } } }); } main();C 实现使用数组模拟优先队列#include stdio.h #include string.h typedef struct { int id; int priority; int seq; } File; File printers[5][1000]; int sizes[5] {0}; int main() { int N; scanf(%d, N); int fileId 1; for (int i 0; i N; i) { char op[5]; scanf(%s, op); if (strcmp(op, IN) 0) { int p, num; scanf(%d %d, p, num); printers[p - 1][sizes[p - 1]].id fileId; printers[p - 1][sizes[p - 1]].priority num; printers[p - 1][sizes[p - 1]].seq fileId; sizes[p - 1]; fileId; } else if (strcmp(op, OUT) 0) { int p; scanf(%d, p); if (sizes[p - 1] 0) { printf(NULL\n); continue; } int maxIdx 0; for (int j 1; j sizes[p - 1]; j) { if (printers[p - 1][j].priority printers[p - 1][maxIdx].priority) { maxIdx j; } else if (printers[p - 1][j].priority printers[p - 1][maxIdx].priority) { if (printers[p - 1][j].seq printers[p - 1][maxIdx].seq) { maxIdx j; } } } printf(%d\n, printers[p - 1][maxIdx].id); for (int j maxIdx; j sizes[p - 1] - 1; j) { printers[p - 1][j] printers[p - 1][j 1]; } sizes[p - 1]--; } } return 0; }总结数据结构优先队列或排序后的数组是解决优先级问题的关键。事件处理区分IN和OUT事件分别处理入队和出队逻辑。优先级规则数字越大优先级越高相同时选择最早入队的文件。