注意事项:

  当有不连续订单时,减完分数后,应先判断一下是否<=3,再加2

参考代码:

import java.util.*;
public class G {
public static class Order{ //订单类
int ts;
int id;
public Order(int id,int ts){
this.id = id;
this.ts = ts;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int t = sc.nextInt();
List
for(int i=0;i<m;i++) {
int ts = sc.nextInt();
int id = sc.nextInt();
list.add(new Order(id,ts));
}
Collections.sort(list,new Comparator
@Override//对订单按照店铺id和时间ts排序
public int compare(Order arg0, Order arg1) {
if(arg0.id!=arg1.id)
return arg0.id-arg1.id;
else
return arg0.ts-arg1.ts;
}
});
int score[] = new int[n+1];//存储店铺优先级,下标从1到n
int prior[] = new int[n+1];//存储店铺是否加入优先缓存,下标从1到n
Order pre = new Order(list.get(0).id,list.get(0).ts);//取第一个订单
score[pre.id]=2;//第一个订单店铺优先级初始化为2
for(int i=1;i<list.size();i++) {//因为第一个订单已被取出,所以下标从1开始
Order aft = new Order(list.get(i).id,list.get(i).ts);//取下一个订单
if(aft.id==pre.id) {//如果本次订单和上一个订单属于一家店铺
if(aft.ts == pre.ts+1 || aft.ts == pre.ts)//如果有连续订单
score[pre.id]+=2;//店铺优先级+2
else {
score[pre.id]=Math.max(score[pre.id]-(aft.ts-pre.ts-1),0);//如果没有连续订单,优先级要减分
if(score[pre.id]<=3) prior[pre.id]=0;//减完后判断一下是否需要出队
score[pre.id]+=2;//加上本次订单的分数
}
}else {//如果本次订单和上次订单不是一家店铺
if(pre.ts!=t)//而且上次订单最后订单时间不是T
score[pre.id]=Math.max(score[pre.id]-(t-pre.ts),0);//减分
if(score[pre.id]<=3) prior[pre.id]=0;//减完后判断一下是否需要出队
score[aft.id]=2;//初始化下一个店铺的分数
}
if(score[pre.id]>5) prior[pre.id]=1;//如果优先级>5,进队
pre=aft;//指向下一个订单店铺
}
int num=0;
for(int i=1;i<=n;i++) {
if(prior[i]==1) num++;
}
System.out.println(num);
}
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论