题目描述
外卖店优先级
“饱了么”外卖系统中维护着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 号) 在优先缓存中。
我主要思路可以从三个数组看出:
第一个二维数组arr[][]记录家店的每个时刻订单量;
第二个数组记录每家店的优先级;
第三个记录优先缓存。
参考代码
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum = 0;
int n, m, t, x, y;
n = sc.nextInt();
m = sc.nextInt();
t = sc.nextInt();
int arr[][] = new int[n + 1][t + 1];
int num[] = new int[n + 1];
boolean f[] = new boolean[n + 1];
while (m > 0) {
x = sc.nextInt();
y = sc.nextInt();
arr[y][x]++;
m--;
}
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < t + 1; j++) {
if (arr[i][j] != 0) {
num[i] = num[i] + 2*arr[i][j];
} else if (num[i] > 0) {
num[i]--;
}
if (num[i] > 5) {
f[i] = true;
}
if (num[i] <= 3 && f[i] == true) {
f[i] = false;
}
}
}
for (int i = 1; i < n + 1; i++) {
if (f[i] == true) {
sum++;
}
}
System.out.println(sum);
sc.close();
}
}