题目描述
“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。
给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中。
【输入格式】
第一行包含 3 个整数 N、M 和 T。
以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到 一个订单。
【输出格式】
输出一个整数代表答案。
package Demo03_20;
//题目描述
//
//“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。
//
//每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
//
//如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。
//
//给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中。
//
//【输入格式】
//
//第一行包含 3 个整数 N、M 和 T。
//
//以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到 一个订单。
//
//【输出格式】
//
//输出一个整数代表答案。
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Demo_06 {
static int[][] host;
static int[][] store;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int T = sc.nextInt();
host = new int[N][2];
int[][] store = new int[M][2];
Set<Integer> prior = new HashSet<Integer>();
for (int i = 0; i < M; i++) {
store[i][0] = sc.nextInt();//ts时刻
store[i][1] = sc.nextInt();//商店编号
}
//每个单位时间取扫描store中的值
for (int i = 1; i < T+1; i++) {
//重置标记
if (i != 1) {
for (int k = 0; k < host.length; k++) {
host[k][1] = 0;
}
}
for (int j = 0; j < store.length; j++) {
//如果该时刻与store中存储的时刻相同
if (check(i, store[j][0])) {
//则在服务器中将该值商店编号的优先级+2
host[store[j][1]-1][0] += 2;
//标记
host[store[j][1]-1][1] = 1;
}
}
//若不满足条件则-2
for (int k = 0; k < host.length; k++) {
if (host[k][0] - 1 >= 0 && host[k][1] == 0) {
host[k][0] -= 1;
}
}
}
//如果该值大于或等于5则将数据存入prior中,过滤掉重复的
for (int j = 0; j < host.length; j++) {
if (host[j][0] > 5) {
prior.add(j+1);
}
}
//显示外卖店个数
System.out.println(prior.size());
}
private static boolean check(int s, int t) {
return (s == t) ? true : false;
}}