蓝桥杯:算法提升-外卖店优先级

外卖店优先级

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


public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int t = sc.nextInt();
		int[][] arr1 = new int[m][2];//订单信息数组    行代表订单数    列代表订单信息(时间 t,店铺id n)
		for (int i = 0; i < arr1.length; i++) {
			for (int j = 0; j < arr1[i].length; j++) {
				arr1[i][j]=sc.nextInt();//录入信息
			}
		}
		int[][] ztandDj = new int[n][2];//等级and状态数组  行代表每个店铺(店铺1对应下标0) 列代表等级状态信息(等级,状态(1为优先级,0不是优先级))  
		int[] sf = new int[n];//改动 标记 (店铺1对应下标0) 数据0代表未改动 1代表已经改动
		for (int i = 1; i <=t; i++) {//一秒一秒走:
			//循环订单 匹配时间
			for (int j = 0; j < m; j++) {
				if(i==arr1[j][0]){//如果在i时间里存在订单
					ztandDj[arr1[j][1]-1][0]+=2;//改变等级 
					sf[arr1[j][1]-1]=1;//改变标记
				}
			}
			//查看标记的状态 修改未被修改过的(在这一时间里不存在订单的)
			for (int j = 0; j < sf.length; j++) {
				if(sf[j]==0){
					if(ztandDj[j][0]>0){
						ztandDj[j][0]-=1;
					}
				}
			}
			//查看改变后的等级 修改优先级
			for (int j = 0; j < ztandDj.length; j++) {
				//未在优先级里的修改
				if(ztandDj[j][1]==0){
					if(ztandDj[j][0]>5){
						ztandDj[j][1]=1;
					}
				}else{//在优先级里的修改
					if(ztandDj[j][0]<4){
						ztandDj[j][1]=0;
					}
				}
			}
			//重置标记数组
			for (int j = 0; j < sf.length; j++) {
				sf[j]=0;
			}
			//打印每次变化的等级和优先级:
			/*System.out.println(i+"秒后:");
			for (int j = 0; j < ztandDj.length; j++) {
				System.out.println("第"+(j+1)+"个商家:等级:"+ztandDj[j][0]+" 是否优先级状态"+ztandDj[j][1]);
			}*/
		}
		int count = 0;
		//计数统计在优先级缓存中的商家
		for (int i = 0; i < ztandDj.length; i++) {
			if(ztandDj[i][1]==1){
				count++;
			}
		}
		System.out.println(count);
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值