【蓝桥杯】外卖店优先级题解

【问题描述】

“饱了么”外卖系统中维护着 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

分析

题目应该比较好读懂,需要注意一下几点

  • 店铺加入优先缓存中还会增加优先级
  • 店铺只有先加入后才能有移除这一说

数据结构

  • 存储优先级的数组
  • 优先缓存区队列
  • 记录每一时刻的订单情况的数据结构,考虑到时间和商家是1对多的关系,使用hashmap<Integer,ArrayList<Integer > >组合的方式

收获

  • 在多个判断条件组合的情况下,很不容易弄清楚if-else的层次,不如将条件分开,而不用逻辑连接起来,这样可能更容易明白
  • 如果只用考虑单个的几种情况,而每种情况之间是独立但不是仅仅的互斥关系,可以写成函数每个if语句里加上return,这样就不用考虑else的这种互斥面

参考代码


import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;

class Main {
	static int n, m, t, value[];
	static Queue<Integer> buffer = new LinkedList<Integer>();
	static HashMap<Integer, ArrayList<Integer>> hp = new HashMap<Integer, ArrayList<Integer>>();

	public static void judeg(int i) {
		if (value[i] > 5 && !buffer.contains(i)) {
			buffer.offer(i);
			return;
		}
		if (value[i] <= 3 && buffer.contains(i)) {
			buffer.remove(i);
			return;
		}
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		m = scanner.nextInt();
		t = scanner.nextInt();
		int ts, id;
		value = new int[n + 1];
		for (int i = 0; i < m; i++) {
			ts = scanner.nextInt();
			id = scanner.nextInt();
			if (hp.containsKey(ts))
				hp.get(ts).add(id);
			else {
				ArrayList<Integer> a = new ArrayList<Integer>();
				a.add(id);
				hp.put(ts, a);
			}
		}
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j < t; j++) {
				ArrayList<Integer> a = hp.get(j);
				if (a != null && a.contains(i)) {
					for (int x : a) {
						if (x == i) {
							value[i] += 2;
							judeg(i);

						}
					}
				} else {
					value[i]--;
					judeg(i);
				}
			}
		}
		System.out.println(buffer.size());
	}
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值