外卖店优先级---模拟

“饱了么”外卖系统中维护着 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.HashSet;
import java.util.Scanner;
import java.util.Set;

public class 外卖店优先级 {
	public static void main(String[] args) {
		int N = 0, M, T = 0;
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();// 店数
		M = sc.nextInt();// 信息条数
		T = sc.nextInt();// 一共多少个时刻
		int priority[] = new int[N + 1];// N家店的优先级
		int sign[][] = new int[T][N];// 记录T时刻某家店有没有订单信息
		Set<Integer> set = new HashSet<Integer>();
		int orders[][] = new int[T][N];// T时刻M条信息

		for (int i = 0; i < T; i++) {
			for (int j = 0; j < N; j++) {
				orders[i][j] = sc.nextInt();
			}
		}

		for (int t = 0; t < T; t++) {
			for (int i = 0; i < N; i++) {
				if (orders[t][1] == i + 1) {// 判断此次订单为哪家店
					sign[orders[t][0] - 1][i] += 1;// 相应时刻的相应店有信息加1,有几次加几次
					// 第二位为时刻,下标减1
				}
			}
		}

		for (int i = 0; i < M; i++) {
			for (int j = 0; j < N; j++) {
				// 如果此店面缓存大于5并且没有加入过集合
				if (priority[j] > 5 && !set.contains(j + 1)) {
					set.add(j + 1);
				}
				// 如果缓存小于等于3,则移除缓存
				if (priority[j] <= 3 && set.contains(j + 1)) {
					set.remove(j + 1);
				}
				// 如果有订单信息,则优先权为之前的加上2*同一时刻的订单次数 j代表第几家
				if (sign[i][j] >= 1) {
					priority[j] += 2 * sign[i][j];
				} else if (priority[j] > 0 && sign[i][j] == 0) {
					// 否则相应的优先权降1
					priority[j] -= 1;
				}
				System.out.println("priority[" + j + "]=" + priority[j]);

			}

		}
		for (int j = 0; j < N + 1; j++) {
			System.out.println(priority[j] + "-----------");
		}
		for (int i : set) {
			System.out.println(set.size());
		}
	}
}

目前只会用数组模拟这个,求更简单和更好理解的解法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值