注意事项:
当有不连续订单时,减完分数后,应先判断一下是否<=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); } }