蓝桥杯2019年第八届javaB组第七题:外卖店优先级

第七题:外卖店优先级
题目描述

“饱了么”外卖系统中维护着 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 号) 在优先缓存中。

【评测用例规模与约定】

对于 80% 的评测用例,1≤ N,M,T ≤10000。
对于所有评测用例,1≤ N,M,T ≤100000,1≤ts≤T,1≤id ≤ N。

时间限制:1.0s

内存限制:512.0MB
 

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in);
		int N, M, T;
		
		N = in.nextInt();   //外卖店数
		M = in.nextInt();	//订单数
		T = in.nextInt();	//时刻

		Boolean[] level = new Boolean[N];	
        //判断外卖店是否处于优先队列,level[0]标志id=1的外卖店...

		ArrayList<Integer>[] arr = new ArrayList[T];	
        //存放每个时刻有订单的外卖店id,如arr[0]存放ts=1时刻的订单信息...

		for(int i = 0; i < T; i++) {
			arr[i] = new ArrayList<Integer>();	//
		}
		
		for(int i = 0; i < M; i++) {
			int ts = in.nextInt();    
			int id = in.nextInt();
			arr[ts - 1].add(id);    
            //ts-1为ts时刻对应的数组下标,如arr[0]保存ts=1时刻订单信息,arr[1]保存ts=2...
		}

		int[][] hunger = new int[N][2];    
        //hunger[i]保存id = i+1的外卖店的信息(i>=0),
        //hunger[i][0]保存id = i+1的外卖店的优先级,hunger[i][1]保存最近一次订单的时间
		
        //遍历每个时刻
		for(int i = 0; i < T; i++) {	
			for(int id : arr[i]) {    //遍历当前时刻的所有订单
				hunger[id - 1][0] += 2;    //有订单的外卖店优先级+2
				hunger[id - 1][1] = i;    //保存该外卖店最最近一次的订单时间
			}
               
            //检查每个外卖店
			for(int j = 0; j < N; j++) {  

                //检查每个外卖店的优先级是否要-1
                //若最近一次订单时间与当前时刻i不相等,说明该外卖店在当前时刻无订单
				if(hunger[j][1] != i && hunger[j][0] != 0) {
					hunger[j][0] -= 1;
				}

                //检查每个外卖店是否处于优先队列
				if(hunger[j][0] > 5) {
					level[j] = true;
				}else if(hunger[j][0] <= 3) {
					level[j] = false;
				}
			}
		}
    
        //统计处于优先队列的外卖店
		int res = 0;
		for(int i = 0; i < N; i++) {
			if(level[i] == true) {
				res++;
			}
		}
		System.out.println(res);

		in.close();
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值