外卖店优先级
【问题描述】
“饱了么”外卖系统中维护着 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);
}
}