蓝桥杯2019初赛 外卖店优先级
因为疫情的原因,4月份的蓝桥杯推迟到了现在,其实一直以来也没有准备这个比赛,只有一两天时间了,刷几道真题抱一下佛脚。
下面开始说正事:
这道题如果思路不对的话,可能做起来非常痛苦。我看了一些网上其他同学的解答,其他方法代码很多,我也没仔细看。不过其他方法应该是直接模拟整个缓存里面的细节情况,所以代码非常繁琐,这里给大家提供一种比较简单的解题方法,思路在代码里面,代码很少,思路也很好理解。
由于本人水平有限,代码有不足的地方欢迎指正,欢迎大家评论交流共同进步!
题目:
【问题描述】
“饱了么”外卖系统中维护着 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
【样例解释】
6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。
解答:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int t = sc.nextInt();
//定义brr[n][t]二维数组,表示第n个店的t时刻有多少订单
int[][] brr = new int[n+1][t+1];
int a =0;
int b =0;
for(int i=0;i<m;i++) {
a = sc.nextInt();//第a时刻
b = sc.nextInt();//第b个店
brr[b][a]+=1;//在b店的a时刻的订单数
}
sc.close();
int ans = 0;//用来记录这个店是否在缓存中的数量,即最终答案
for(int i=1;i<n+1;i++) {
int prior =0;//用于判断第i个店的优先级
boolean position = false;//用于判断第i个店第j时刻是在缓存里还是缓存外
for(int j=1;j<t+1;j++) {
if(brr[i][j]==0) {//当第i个店的j时刻没有订单时,优先级要减一,同时最小为0
prior-=1;
prior = prior>=0?prior:0;
}else {
prior +=2*brr[i][j];//有订单,优先级则乘2
}
if(prior>5)position=true;//若此时优先级大于5,则在缓存里面
if(prior<=3)position=false;//若此时优先级小于等于3,则肯定在缓存外面
}
if(position)ans++;//把第i个店的所以时间点都判断完,最终看这个店的位置,缓存里则ans加一
}
System.out.println(ans);
}
}