(蓝桥)外卖店优先级

外卖店优先级

题目

问题描述

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

思路

本题的最终结果是返回优先级数达标的店铺数,(可以想到存入某个容器中,再返回容器的大小,并且这个容器可以对容器中任意一个元素进行操作删除,这样就排除使用栈和队列,于是我们使用的是Map,但也可以用Set,毕竟店铺各不相同)
。。。。。。。。。。。。废话一堆,正题回归


由输入可以看出,输入表示某一时刻某一店铺有订单,时刻可以对应店铺,那么可以创建一个二维数组,数组的值为订单数,行列分别表示店铺和时刻
最后通过二维数组元素的值去求解优先级,进一步判断是否进入map

。。。。。。。。。。。。。。。。。。
bibi一大堆,上代码得了

代码贴上

package practise.bluecompetion2019;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class 外卖店优先级 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n=input.nextInt();//n家店
        int m=input.nextInt();//m条订单
        int t=input.nextInt();//总时刻
        int[] idtosum=new int[n+1];//计算优先级
        HashMap<Integer, Integer> themap = new HashMap<Integer, Integer>();//创建优先缓存

        int[][] tsforid = new int[n+1][t+1];//对应时刻对于店铺是否有订单
        for (int i = 1; i <=m; i++) {
            int ts=input.nextInt();
            int id=input.nextInt();
            tsforid[id][ts]++;//对应店铺值订单数加一
        }

        //计算优先级,并判断是否能进入优先缓存
        for (int i = 1; i <=n; i++) {
            for (int j = 1; j <=t; j++) {
                if (tsforid[i][j]==0){
                    idtosum[i]=Math.max(0,idtosum[i]-1);//没有订单取0,或减一
                }else {
                    idtosum[i]+=tsforid[i][j]*2;//如果有订单,定单数乘2
                }
                if (idtosum[i]>5){//优先级大于5将店铺号加入map中
                    themap.put(i,1);
                }
                if (themap.containsKey(i)&&idtosum[i]<=3){//小于从店铺中移除(前提是存在与店铺中)
                    themap.remove(i);
                }
            }
        }
        System.out.println(themap.size());
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值