题目
问题描述
“饱了么”外卖系统中维护着 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
思路
本题的最终结果是返回优先级数达标的店铺数,(可以想到存入某个容器中,再返回容器的大小,并且这个容器可以对容器中任意一个元素进行操作删除,这样就排除使用栈和队列,于是我们使用的是Map,但也可以用Set,毕竟店铺各不相同)
。。。。。。。。。。。。废话一堆,正题回归
由输入可以看出,输入表示某一时刻某一店铺有订单,时刻可以对应店铺,那么可以创建一个二维数组,数组的值为订单数,行列分别表示店铺和时刻
最后通过二维数组元素的值去求解优先级,进一步判断是否进入map
。。。。。。。。。。。。。。。。。。
bibi一大堆,上代码得了
代码贴上
package practise.bluecompetion2019;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
public class 外卖店优先级 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n=input.nextInt();//n家店
int m=input.nextInt();//m条订单
int t=input.nextInt();//总时刻
int[] idtosum=new int[n+1];//计算优先级
HashMap<Integer, Integer> themap = new HashMap<Integer, Integer>();//创建优先缓存
int[][] tsforid = new int[n+1][t+1];//对应时刻对于店铺是否有订单
for (int i = 1; i <=m; i++) {
int ts=input.nextInt();
int id=input.nextInt();
tsforid[id][ts]++;//对应店铺值订单数加一
}
//计算优先级,并判断是否能进入优先缓存
for (int i = 1; i <=n; i++) {
for (int j = 1; j <=t; j++) {
if (tsforid[i][j]==0){
idtosum[i]=Math.max(0,idtosum[i]-1);//没有订单取0,或减一
}else {
idtosum[i]+=tsforid[i][j]*2;//如果有订单,定单数乘2
}
if (idtosum[i]>5){//优先级大于5将店铺号加入map中
themap.put(i,1);
}
if (themap.containsKey(i)&&idtosum[i]<=3){//小于从店铺中移除(前提是存在与店铺中)
themap.remove(i);
}
}
}
System.out.println(themap.size());
}
}