第十届蓝桥杯大赛软件类省赛Java大学B组 试题 G: 外卖店优先级

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分

【问题描述】 “饱了么”外卖系统中维护着 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

代码如下:

import java.util.*;


public class 外卖优先级 {
     
    public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int M = scanner.nextInt();
        int T = scanner.nextInt();


        int[][] ints_time_number = new int[M][T];    //存放时刻和店号的数组

        int result = 0; //最后,在优先缓存区里的店的个数

        HashMap<Integer,Integer> hashMap = new HashMap<>();
        for (int i = 1; i <= N; i++) {
     
            hashMap.put(i,0);
        }
        Set<Integer> set = hashMap.keySet();

        for (int j = 0; j < M; j++) {
     
            ints_time_number[j][0] = scanner.nextInt();   //时刻
            ints_time_number[j][1] = scanner.nextInt(); //店号

        }

        for(int i=0; i<M-1; i++){
     
            for(int j=0; j<M-1-i; j++){
     
                if(ints_time_number[j][0] > ints_time_number[j+1][0]){
     
                    int temp = ints_time_number[j][0];
                    ints_time_number[j][0] = ints_time_number[j+1][0];
                    ints_time_number[j+1][0] = temp;
                }
            }
        }

        ArrayList<Integer> arrayList = new ArrayList<>();
        for (int i = 0; i < T; i++) {
     
            arrayList.add(i+1);
        }

        for (Integer k : set) {
     
            for (int i = 0; i < M; i++) {
     
                if (ints_time_number[i][1] == k) {
           //看店号
                    hashMap.put(k, hashMap.get(k) + 2);
                } else {
     
                    hashMap.put(k, hashMap.get(k) - 1);
                    if (hashMap.get(k) < 0) {
     
                        hashMap.put(k, 0);
                    }
                }
            }
        }

        Set<Integer> set1 = new HashSet<>();
        for (int i = 0; i < arrayList.size(); i++) {
     
            set1.add(ints_time_number[i][0]);
        }

        //比较 去重后的 与 不去重的 个数,求差值
        int no_exist = arrayList.size() - set1.size();
        for (int i = 0; i < no_exist; i++) {
     
            for (Integer n:set) {
     
                hashMap.put(n,hashMap.get(n)-1);
                if (hashMap.get(n) < 0) {
     
                    hashMap.put(n,0);
                }
            }
        }


        for (Integer integer: set) {
     
            if (hashMap.get(integer) > 5) {
     
                result ++;
            }
        }

        System.out.println(result);

    }
}

重点:
一、将时间由小到大排序了后,即可得到时间排序后的对应的店家号码,遍历号码,一次与键比较,如果相同,则优先级加2,如果不相同就减1。
二、针对有的时间点没有订单,思想如下:
时间点: 1 2 3 5 6 6
arraylist:1 2 3 4 5 6
将时间点放进set中去重,可得知重复元素的个数是多少,也就是有多少个时间点没有订单,则需要将每个店家的优先级都减1.

你可能感兴趣的:(蓝桥杯,java)