写在前面
这个代码的时间复杂度(O(n^2))还是有点高的,估计有几个样例是过不了的,但是大部分还是可以过的。
问题描述
“饱了么”外卖系统中维护着 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
算法思路
由分析可知,如果我们可以建立一张店铺订单数量和时刻相关联的表,则可以很清楚的计算各时刻各店铺的优先级数。因而我们可以借助二维数组orderTable(店铺id为行,时刻t为列)来表示该表,然后遍历该数组并逐个计算各时刻下各店铺的优先级数,如果符合条件则加入map中并以店铺id为key值,若不符合条件则将其移出,最后查看map中有多少项,即可。
算法如下
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int m = cin.nextInt();
int t = cin.nextInt();
//首先我们需要有一张关于店铺Id和时间的线性表(二维数组)
int[][] orderShops = new int[n+1][t+1];
//然后我们需要显示店铺的优先级
int[] countShops = new int[n+1];
//最后我们需要HashMap来存储缓存队列
HashMap<Integer,Integer> hashMap = new HashMap<>();
for(int i =0;i<m;i++){
int ts = cin.nextInt();
int id = cin.nextInt();
// if(ts <= t){
orderShops[id][ts] ++;
// }
}
for(int i =1;i <= n;i++){
for(int j =1;j <= t;j++){
if(orderShops[i][j]==0){ //在j时刻店铺i没有订单
countShops[i] = Math.max(0,countShops[i]-1);
}else { //有订单的时候
countShops[i] +=orderShops[i][j]*2;
}
//每个时刻都需要自己去不断刷新,然后判断哪些在缓存对列的去留
if(countShops[i] >5){
hashMap.put(i,1);
}
if(countShops[i] <=3 && hashMap.containsKey(i)){
hashMap.remove(i);
}
}
}
System.out.println(hashMap.size());
cin.close();
}
}