第十届省赛——7外卖店优先级

文章描述了一个外卖系统的优先级缓存管理机制,其中外卖店的优先级根据订单情况动态变化。在给定的时间段内,需要计算有多少家外卖店的优先级满足条件,从而存在于优先缓存中。算法涉及对订单信息的处理和优先级的增减判断。
摘要由CSDN通过智能技术生成

题目:

“饱了么”外卖系统中维护着N 家外卖店,编号1~N。

每家外卖店都有一个优先级,初始时(0 时刻) 优先级都为0。

每经过1 个时间单位,如果外卖店没有订单,则优先级会减少1,最低减到0;

而如果外卖店有订单,则优先级不减反加,每有一单优先级加2。

如果某家外卖店某时刻优先级大于5,则会被系统加入优先缓存中;

如果优先级小于等于3,则会被清除出优先缓存。

给定T 时刻以内的M 条订单信息,请你计算T 时刻时有多少外卖店在优先缓存中。

输入

第一行包含3 个整数N、M 和T。

以下M 行每行包含两个整数ts 和id,表示ts 时刻编号id 的外卖店收到一个订单

1<=N, M, T<=100000,1<=ts<=T,1<=id<=N。

输出

输出一个整数代表答案。

样例输入

2 6 6

1 1

5 2

3 1

6 2

2 1

6 2

样例输出

1

分析:

先建一个用来储存id和订单时间的数组,然后通过扫描器把id ts打印进去,之后外层控制n(店铺数量,二维数组外层),内层控制t(这个时间之内的订单计算),遍历出每个n的所有时间,然后根据这个时间有多少订单再进行相对应的计算,每次经过一个地方就要判断此时是不是优先缓存。最终true就是优先缓存

下图是题目给定的例子,转换成表格,也就是本题所转换的二维数组

每个格子中有两种情况,

第一种情况是有数字,有数字的话,num就加上(格子中的数字乘以2)这个数字。

第二种情况没有数字,没有数字的情况下,num-1,但如果num==0的话,num继续=0。

每一次判断完格子,就进行一次判断,来判断num符不符合加入优先缓存的条件,加不加入,用boolean判断来判断,加入的话就让boolean等于true。

进行完一个id的num值加减之后,boolean依然为true,那么count++;(该id最终加入到优先缓存中)

步骤:

package 历届真题省赛阶段;

import java.util.Scanner;

public class 测试1 {

    public static void main(String[] args) {
//        第一行包含 3 个整数 N、M 和 T。
//        以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到
//        一个订单。
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();// 多少个店铺
        int m = sc.nextInt();// 多少条订单
        int t = sc.nextInt();// t时间之内的订单
        int[][] zu = new int[n+1][m+1];//用来储存每个店铺在某个时刻有多少订单
        int count = 0;
        for (int i = 1; i <= m; i++) {
            int ts = sc.nextInt();
            int id = sc.nextInt();
            zu[id][ts]++;//外层id内层时间,数量用值来表示
        }
        for (int i = 1; i <= n; i++) {//遍历数组中每个id的值,根据值进行num的变化
            int num = 0;//缓存值
            boolean flag = false;
            for (int j = 1; j <= t; j++) {
                if (zu[i][j] == 0) {//该时间没有订单的情况
                    if (num == 0) {//如果是0就不用继续减了,不是0的话进行自减
                        num = 0;
                    } else {
                        num--;
                    }
                } else {
                    num += zu[i][j] * 2;//有订单的话,num本身值再加上这个时间订单数量乘以二
                }
                if (num > 5) {//每次经过一个时间都做一次判断,判断此时是不是在优先缓存中
                    flag = true;
                }
                if (num <= 3) {
                    flag = false;
                }
            }
            if (flag) {
                count++;
            }
        }
        System.out.println(count);
        sc.close();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W少年没有乌托邦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值