1、问题描述
【问题描述】
“饱了么”外卖系统中维护着 N家外卖店,编号1~N。每家外卖店都有
- 个优先级,初始时 (0 时刻)优先级都为 0。
每经过 1个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减
到0:而如果外卖店有订单,则优先级不诚反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中,如果
优先级小于等于 了,则会被清除出优先缓存。
给定工 时刻以内的 M 条订单信息,请你计算工 时刻时有多少外卖店在优
先缓存中。
【输入格式】
第一行包含3个整数 N、M和T。
以下M行每行包含两个整数s 和id,表示is时刻编号 id 的外卖店收到
一个订单。
【输出格式】
输出一个整数代表答案。
【样例输入】
266
11
5 2
31
62
21
62
【样例输出】
1
2、代码实现
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//外卖店的个数
int N = scanner.nextInt();
//订单的数量
int M = scanner.nextInt();
//时刻
int T = scanner.nextInt();
//存储结果
int ans = 0;
//key=外卖店的编号,value=该外卖店在那些时刻有订单
Map<Integer,ArrayList<Integer>> map = new TreeMap<>();
//接收输入的订单信息
for(int i = 0;i < M;i++) {
int time = scanner.nextInt();
int id = scanner.nextInt();
if(map.containsKey(id)) {
map.get(id).add(time);
}else {
ArrayList<Integer> temp = new ArrayList<>();
temp.add(time);
map.put(id, temp);
}
}
//遍历每一家外卖店
for(Map.Entry<Integer, ArrayList<Integer>> entry : map.entrySet()) {
//获取该外卖店的订单信息
ArrayList<Integer> orders = entry.getValue();
//整理订单信息
int[] count = new int[T + 1];
for(int j = 0;j < orders.size();j++) {
count[orders.get(j)]++;
}
//汇总该外卖店的优先级
boolean flag = false;
int priority = 0;
for(int j = 1;j <= T;j++) {
if(count[j] == 0) {
if(priority > 0) {
priority--;
}
if(priority <= 3) {
flag = false;
}
}else {
priority += count[j] * 2;
if(priority > 5) {
flag = true;
}
}
}
if(flag) {
ans++;
}
}
System.out.println(ans);
}
}