试题 G: 外卖店优先级

2019第十届蓝桥杯省赛java b组总结
试题 G: 外卖店优先级
【问题描述】
“饱了么”外卖系统中维护着 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。

思路:

对输入的订单时间进行排序,然后转换成list,对1-T时间进行遍历,每个时间段所有非0的店先全部-1,在LIst里面找当前时间段的订单并对其店的优先值+3,最后遍历所有店铺的优先值大于5则在缓冲区中

import java.util.ArrayList;
import java.util.Scanner;

public class B7 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		int N = scanner.nextInt();
		int M = scanner.nextInt();
		int T = scanner.nextInt();
		int a[][] = new int[M][2];
		int b[] = new int[N+1];
		for(int i = 0; i < M; i++) {
			a[i][0] = scanner.nextInt();
			a[i][1] = scanner.nextInt();
		}
		
		//按时刻排序
		for(int i=0; i<M-1; i++){
			for(int j=i+1; j<M; j++){
				if(a[i][0]>a[j][0]){
					int temp = a[i][0];
					a[i][0] = a[j][0];
					a[j][0] = temp;
					temp = a[i][1];
					a[i][1] = a[j][1];
					a[j][1] = temp;
				}
			}
		}
		
		
		ArrayList<int[]> list = new ArrayList<int[]>();
		for(int i = 0; i < M; i++){
			list.add(a[i]);
		}
		
		for(int i = 1; i <= T; i++) {
			for(int j = 0; j < N; j++) {
				if(b[j] != 0) {
					b[j]--;
				}
			}
			
			//判断I时刻有无订单
			while(list.size() != 0 && list.get(0)[0] == i) {
				int p = list.get(0)[1]-1;
				b[p] += 3;
				list.remove(0);
			}
		}
		int sum = 0;
		for(int i = 0; i < N; i++) {
			if(b[i] > 5) {
				sum++;
			}
		}
		System.out.println(sum);
		
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值