一 问题描述
银行的每个客户都有一个正整数标识 K,到银行请求服务时将收到一个正整数优先级 P。银行经理提议打破传统,有时为优先级低的客户服务,而不是为优先级高的客户服务,系统将收到以下类型的请求。
0:系统需要停止服务
1 K P:将客户 K 及其优先级 P 添加到等待列表中。
2:为优先级高的客户提供服务,并将其从等待名单中删除。
3:为优先级低的客户提供服务,并将其从等待名单中删除。
输入:输入的每一行都包含一个请求,只有最后一行包含停止请求(代码0)。假设在列表中包含新客户的请求(代码1),在列表中没有同一客户的其他请求或有相同优先级。客户可以多次到银行请求服务,并且每次都可以获得不同的优先级。
输出:对于代码2或3的请求,都单行输出所服务的客户标识。如果请求时等待列表为空,则输出0。
输入样例
2
1 20 14
1 30 3
2
1 10 99
3
2
2
0
输出样例
0
20
30
10
0
二 算法设计
本问题包括插入、删除优先级最大元素和删除优先级最小元素这3种操作。map 本身第1元素(键)有序,因此可将优先级作为第1优先级。
三 代码
package map;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class BankMap {
public static void main(String[] args) {
// 请求代号
int n;
// 表示客户
int k;
// 表示优先级
int p;
Map<Integer, Integer> map = new HashMap<>();
Scanner scanner = new Scanner(System.in);
while (true) {
n = scanner.nextInt();
switch (n) {
case 0:
return;
case 1:
k = scanner.nextInt();
p = scanner.nextInt();
map.put(p, k);
break;
case 2:
if (map.isEmpty()) {
System.out.println("0");
break;
}
Set<Map.Entry<Integer, Integer>> entries2 = map.entrySet();
Integer key2 = null;
Integer value2 = null;
for (Map.Entry<Integer, Integer> entry : entries2) {
key2 = entry.getKey();
value2 = entry.getValue();
}
System.out.println(value2);
map.remove(key2);
break;
case 3:
if (map.isEmpty()) {
System.out.println("0");
break;
}
Set<Map.Entry<Integer, Integer>> entries3 = map.entrySet();
for (Map.Entry<Integer, Integer> entry : entries3) {
Integer key3 = entry.getKey();
Integer value3 = entry.getValue();
System.out.println(value3);
map.remove(key3);
break;
}
break;
}
}
}
}
四?测试
绿色为输入,白色为输出
|