蓝桥杯2019初赛 外卖店优先级 java

蓝桥杯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);
	}
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值