蓝桥杯 外卖店的优先级 Java 易懂版 (80%得分考试混分版)

题目描述

“饱了么”外卖系统中维护着 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≤105,
1≤ts≤T,
1≤id≤N

输入样例:

2 6 6
1 1
5 2
3 1
6 2
2 1
6 2

输出样例:

1

样例解释

6时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6,加入优先缓存。所以是有 1家店 (2 号) 在优先缓存中。

思路

题目大概意思,N家外卖店,有订单的时候热度加2,没有订单的且热度不
为0的时候热度减1,热度大于5的时候时候进入优先缓存,小于等于3的时
候移除优先缓存,输出在T时刻时有多少店在优先缓存中。

1.用List来数组来存,每一个List new一个ArrayList()
	List array[]=new ArrayList[T+1];    //存放每个时刻对应的店铺
        for(int i=0;i<=T;i++){
            array[i]=new ArrayList();
        }
把每个时刻和对应的id输进去,再按时间从大到小来循环就不用排序了

2 同一时刻有多个订单,所以我们要循环一下,Lisr.remove之后看是否还
有订单,如果全部循环结束,就把没有订单的且热度大于1的店铺热度减1,
最后输出答案即可

代码

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int N=input.nextInt();
        int M=input.nextInt();
        int T=input.nextInt();
        List arr[]=new ArrayList[T+1];
        int better[]=new int[N+1];
        boolean  level[]=new boolean[N+1];
        for(int i=0;i<=T;i++){
            arr[i]=new ArrayList();
        }
        for(int i=1;i<=M;i++){
            int ts=input.nextInt();
            int id=input.nextInt();
            arr[ts].add(id);    //t时刻有店铺id的订单,
        }
        for(int i=1;i<=T;i++){
            for(int j=1;j<=N;j++){
                int flag=0;
                Object k=j;
                while (arr[i].contains(k)){
                    flag=1;
                    
                    better[j]+=2;
                    arr[i].remove(k);
                    if(better[j]>5)
                        level[j]=true;
                }
                if(flag==0) {    //此时刻无店铺j的订单
                    better[j] = better[j] == 0 ? 0 : better[j] - 1;
                    if (level[j]) {    //原来在缓存队列
                        if (better[j] <= 3) {    //优先级下降
                            level[j] = false;

                        }
                    }
                }


            }

        }
        int count=0;
        for(int i=1;i<=N;i++){
            if(level[i])
                count++;
        }
        System.out.println(count);
    }
}

要想知道满分解法,这里有链接acwing月夜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值