题目:
“饱了么”外卖系统中维护着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<=100000,1<=ts<=T,1<=id<=N。
输出
输出一个整数代表答案。
样例输入
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
样例输出
1
分析:
先建一个用来储存id和订单时间的数组,然后通过扫描器把id ts打印进去,之后外层控制n(店铺数量,二维数组外层),内层控制t(这个时间之内的订单计算),遍历出每个n的所有时间,然后根据这个时间有多少订单再进行相对应的计算,每次经过一个地方就要判断此时是不是优先缓存。最终true就是优先缓存
下图是题目给定的例子,转换成表格,也就是本题所转换的二维数组
![](https://i-blog.csdnimg.cn/blog_migrate/75959f5f926163dd5b67ab9998a62086.png)
每个格子中有两种情况,
第一种情况是有数字,有数字的话,num就加上(格子中的数字乘以2)这个数字。
第二种情况没有数字,没有数字的情况下,num-1,但如果num==0的话,num继续=0。
每一次判断完格子,就进行一次判断,来判断num符不符合加入优先缓存的条件,加不加入,用boolean判断来判断,加入的话就让boolean等于true。
进行完一个id的num值加减之后,boolean依然为true,那么count++;(该id最终加入到优先缓存中)
步骤:
![](https://i-blog.csdnimg.cn/blog_migrate/5ff862976dfa5aa9affe65b92439d346.png)
package 历届真题省赛阶段;
import java.util.Scanner;
public class 测试1 {
public static void main(String[] args) {
// 第一行包含 3 个整数 N、M 和 T。
// 以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到
// 一个订单。
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();// 多少个店铺
int m = sc.nextInt();// 多少条订单
int t = sc.nextInt();// t时间之内的订单
int[][] zu = new int[n+1][m+1];//用来储存每个店铺在某个时刻有多少订单
int count = 0;
for (int i = 1; i <= m; i++) {
int ts = sc.nextInt();
int id = sc.nextInt();
zu[id][ts]++;//外层id内层时间,数量用值来表示
}
for (int i = 1; i <= n; i++) {//遍历数组中每个id的值,根据值进行num的变化
int num = 0;//缓存值
boolean flag = false;
for (int j = 1; j <= t; j++) {
if (zu[i][j] == 0) {//该时间没有订单的情况
if (num == 0) {//如果是0就不用继续减了,不是0的话进行自减
num = 0;
} else {
num--;
}
} else {
num += zu[i][j] * 2;//有订单的话,num本身值再加上这个时间订单数量乘以二
}
if (num > 5) {//每次经过一个时间都做一次判断,判断此时是不是在优先缓存中
flag = true;
}
if (num <= 3) {
flag = false;
}
}
if (flag) {
count++;
}
}
System.out.println(count);
sc.close();
}
}