题目描述
“饱了么”外卖系统中维护着 N 家外卖店,编号 1∼N。每家外卖店都有一个优先级,初始时 (0
时刻) 优先级都为 0。
每经过 1个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果优先级小于等于 3,则会被清除出优先缓存。
给定 T时刻以内的 M 条订单信息,请你计算 T时刻时有多少外卖店在优先缓存中。
输入格式
第一行包含 3个整数 N,M,T。以下 M行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id的外卖店收到一个订单。
输出格式
输出一个整数代表答案。
数据范围
1≤N,M,T≤105,
1≤ts≤T,
1≤id≤N
输入样例:
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
输出样例:
1
样例解释
6时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6,加入优先缓存。所以是有 1家店 (2 号) 在优先缓存中。
思路:
题目大概意思,N家外卖店,有订单的时候热度加2,没有订单的且热度不
为0的时候热度减1,热度大于5的时候时候进入优先缓存,小于等于3的时
候移除优先缓存,输出在T时刻时有多少店在优先缓存中。
1.用List来数组来存,每一个List new一个ArrayList()
List array[]=new ArrayList[T+1]; //存放每个时刻对应的店铺
for(int i=0;i<=T;i++){
array[i]=new ArrayList();
}
把每个时刻和对应的id输进去,再按时间从大到小来循环就不用排序了
2 同一时刻有多个订单,所以我们要循环一下,Lisr.remove之后看是否还
有订单,如果全部循环结束,就把没有订单的且热度大于1的店铺热度减1,
最后输出答案即可
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int N=input.nextInt();
int M=input.nextInt();
int T=input.nextInt();
List arr[]=new ArrayList[T+1];
int better[]=new int[N+1];
boolean level[]=new boolean[N+1];
for(int i=0;i<=T;i++){
arr[i]=new ArrayList();
}
for(int i=1;i<=M;i++){
int ts=input.nextInt();
int id=input.nextInt();
arr[ts].add(id); //t时刻有店铺id的订单,
}
for(int i=1;i<=T;i++){
for(int j=1;j<=N;j++){
int flag=0;
Object k=j;
while (arr[i].contains(k)){
flag=1;
better[j]+=2;
arr[i].remove(k);
if(better[j]>5)
level[j]=true;
}
if(flag==0) { //此时刻无店铺j的订单
better[j] = better[j] == 0 ? 0 : better[j] - 1;
if (level[j]) { //原来在缓存队列
if (better[j] <= 3) { //优先级下降
level[j] = false;
}
}
}
}
}
int count=0;
for(int i=1;i<=N;i++){
if(level[i])
count++;
}
System.out.println(count);
}
}
要想知道满分解法,这里有链接acwing月夜