试题 G: 外卖店优先级
【问题描述】
“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有
一个优先级,初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减
到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果
优先级小于等于 3,则会被清除出优先缓存。
给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优
先缓存中。
【输入格式】
第一行包含 3 个整数 N、M 和 T。
以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到
一个订单。
【输出格式】
输出一个整数代表答案。
【样例输入】
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
【样例输出】
1
【样例解释】
6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6,
加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ N, M,T ≤ 10000。
对于所有评测用例,1 ≤ N, M,T ≤ 100000,1 ≤ ts ≤ T,1 ≤ id ≤ N。
【代码】
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
// BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Main main = new Main();
main.receiveData();
System.out.println(main.solve());
}
int N, M, T;
ArrayList<order> orderList = new ArrayList<order>(); // 订单列表
void receiveData() { // 接受数据
Scanner reader = new Scanner(System.in);
N = reader.nextInt();
M = reader.nextInt();
T = reader.nextInt();
for (int i = 0; i < M; i++) {
orderList.add(new order(reader.nextInt(),reader.nextInt()));
}
}
// 函数返回T时刻时优先缓存中的外卖店数
@SuppressWarnings("unchecked")
int solve() {
Collections.sort(orderList); // 按照ts大小升序排列
int[] takeaway = new int[N]; // 外卖店优先级
boolean[] flag = new boolean[N]; // 标记外卖店是否收到订单
LinkedList<Integer> priortyCache = new LinkedList<Integer>(); // 优先缓存
int k = 0;
for (int i = 0; i < T; i++) {
Arrays.fill(flag, false);
while (k < M && orderList.get(k).ts == i + 1) { // 若i+1时刻有订单
takeaway[orderList.get(k).id - 1] += 2;
flag[orderList.get(k).id - 1] = true;
if (takeaway[orderList.get(k).id - 1] > 5) priortyCache.add(orderList.get(k).id - 1); // 若优先级大于5,加入优先缓存
k++;
}
for (int j = 0; j < N; j++) {
if (!flag[j]) { // 若i+1时刻j+1号店没接到订单
takeaway[j] = takeaway[j] - 1 > 0 ? takeaway[j] - 1 : 0; // 最多降低到0
if (takeaway[j] <= 3) priortyCache.remove(new Integer(j)); // 若优先级小于等于3,清除出优先缓存
}
}
}
return priortyCache.size();
}
}
class order implements Comparable<order> { // 订单类
int ts;
int id;
order(int ts, int id) {
this.ts = ts;
this.id = id;
}
@Override
public int compareTo(order order2) {
return ts - order2.ts;
}
}