输入样例:

2 6 6
1 1
5 2
3 1
6 2
2 1
6 2

输出样例:

1

样例解释

66 时刻时,11 号店优先级降到 33,被移除出优先缓存;22 号店优先级升到 66,加入优先缓存。

所以是有 11 家店 (22 号) 在优先缓存中。


解题思路:

最直接的暴力想法是:通过枚举每个店的 0~ t的时间来判断到t时刻时,优先级是否在缓存中。但由于店数和时间都是10^5,平方的复杂度肯定会超时,并且因为要同时记录店铺,时间,订单数,需要用到二维数组,也会内存超限。

优化:可以注意到订单的数量也是10^5,与店数规模相同,可以看出平均每个店只有一个订单,是非常离散化的,所以当遍历订单时,时间复杂度可以降为O(n)。

可以先按订单的时间排序,依次遍历,遍历每份订单时,由于时间并不连续,所以为了可以知道上一份订单的时间(用来降低优先级),需要开一个数组,用来表示每个店最后一次出现订单的时刻,可以直接算出"一长段"时间的优先级,遍历完时,还需要将与t之前的没有出现订单的优先级降低。同时再开一个数组再记录每个店是否在优先缓存中,最后统计数量。

Java代码:O(nlogn)

import java.io.*;
import java.util.*;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] split = br.readLine().split(" ");int n = Integer.parseInt(split[0]);//外卖店数量int m = Integer.parseInt(split[1]);//订单总数int t = Integer.parseInt(split[2]);//时间int []pri = new int[n + 1];//priority:优先先数组 pri[i] = j: 表示第i个店的优先级为jint []last = new int[n + 1];//last[i]=j :表示第i个店最近一次有订单的时间是第j秒boolean []flag = new boolean[t + 1];//表示该店是否已经进入优先缓存中List<Inf1241> list = new ArrayList<>();//存储订单for(int i = 0; i < m; i++) {split = br.readLine().split(" ");int ts = Integer.parseInt(split[0]);int id = Integer.parseInt(split[1]);list.add(new Inf1241(ts, id));}Collections.sort(list);//将所有订单按订单的时间排序for(int i = 0; i < m; ) {//遍历订单,因为可能有重复订单,i的下标由重复订单的数量决定int j = i;while(j < m && list.get(j).ts == list.get(i).ts && list.get(j).id == list.get(i).id) j++;//循环结束时,j指向新的一份订单int ts = list.get(j - 1).ts, id = list.get(j - 1).id, cnt = j - i;//cnt:有重复订单的数量i = j;//方便下一次循环pri[id] -= ts - last[id] - 1;//因为订单的时间不是连续的,通过last数组处理之前的优先级(注意边界)if(pri[id] < 0) pri[id] = 0;//优先级最低为0if(pri[id] <= 3) flag[id] = false;pri[id] += cnt * 2;//处理此时的新的订单if(pri[id] > 5) flag[id] = true;last[id] = ts;//记录该店最后一次有订单的时间}for(int i = 1; i <= n; i++) //最后一段时间可能存在有店持续没有订单,需要降低优先级if(last[i] < t) {pri[i] -= t - last[i];//(注意边界)if(pri[i] <= 3) flag[i] = false;}int ans = 0;for(boolean data : flag) if(data) ans++;System.out.println(ans);}
}
class Inf1241 implements Comparable<Inf1241>{int ts;int id;public Inf1241(int ts, int id) {this.ts = ts;this.id = id;}@Overridepublic int compareTo(Inf1241 o) {if(this.ts != o.ts) return this.ts -o.ts;else return this.id - o.id;}
}

Java代码:O(n^2)

import java.io.*;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] split = br.readLine().split(" ");int n = Integer.parseInt(split[0]);//店铺数int m = Integer.parseInt(split[1]);//订单总数int t = Integer.parseInt(split[2]);//时间int [][]pri = new int[n + 1][t + 1];//优先缓存for(int i = 0; i < m; i++) {split = br.readLine().split(" ");int ts = Integer.parseInt(split[0]);int id = Integer.parseInt(split[1]);pri[id][ts]++;//表示第id个店第ts秒的订单数量}int ans = 0;for(int i = 1; i <= n; i++) {//枚举外卖店int s = 0;//第i个店的优先级for(int j = 1; j <= t; j++) {//枚举时间if(pri[i][j] != 0) {//有订单时s += pri[i][j] * 2;}else {//没有订单if(s > 0)s--;}}if(s > 5)ans++;else if(s == 4 && pri[i][t] == 0 && t >=1 && pri[i][t - 1] == 0)ans++;//优先级4可能是被降下来的,仍然在缓存中else if(s == 5 && pri[i][t] == 0)ans++;}System.out.println(ans);}
}

1241. 外卖店优先级 Java题解 (模拟)【第十届蓝桥杯省赛C++A/C组,JAVA A/B/C组】相关推荐

  1. 模拟-第十届蓝桥杯省赛C++A组-外卖店优先级

    模拟-第十届蓝桥杯省赛C++A组-外卖店优先级 题目: "饱了么"外卖系统中维护着 N 家外卖店,编号 1∼N. 每家外卖店都有一个优先级,初始时 (0 时刻) 优先级都为 0. ...

  2. java迷宫类编程题_第十届蓝桥杯省赛java类B组 试题 E:迷宫 (动态规划之回溯法)...

    问题描述 试题 E: 迷宫 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方. 010000 000100 001001 110000 迷宫的入口为 ...

  3. java蓝桥杯省赛第十届_2019年第十届蓝桥杯省赛-迷宫(BFS/Excel大法)

    这题用dfs搜不出来,需要使用bfs并记录路径,设置好方向顺序跑就ok 然而毕竟是暴力杯,我们的原则是代码能省就省(懒癌晚期 于是乎网上便出现了形形色色的题解,笔者综合了各路大神神乎其技的思想,总结出 ...

  4. 2019 第十届蓝桥杯省赛C/C++大学B组 试题+题解

    第十届蓝桥杯省赛C/C++大学B组 试题+题解 第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组 考生须知 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试 题. 考试时间为 4 ...

  5. 第十届蓝桥杯省赛C/C++B组题解与感想

    第一次参加蓝桥杯的感想和总结 1.本次比赛整体而言其实是发挥出了正常的水平的,考试的发挥也算正常(有点受考试环境的影响:1.考试题目以图片形式给出2.控制台复制粘贴受限,但是这都不是主要的原因,),但 ...

  6. 蓝桥杯java 大纲,2019 第十届蓝桥杯Java省赛B组个人总结

    前言 19年的这场蓝桥杯,对我自己的打击挺大的,以至于时隔多个月之后第十一届蓝桥杯要开始报名的时候,我才敢面对他.报名第十届蓝桥杯的时候我大二,自我感觉学的不错,但事实并非如此,当入了那句话,学术不精 ...

  7. 第十届蓝桥杯省赛JavaB组G_外卖店优先级

    题目: 思路: 本题关键是二维数组的建立,二维数组保存的意义.如下图: 二维数组以时间.店数建立 在输入数据的时候,判断某时刻的某家店的订单情况,直接加到订单数中,之后进行for循环,利用set集合便 ...

  8. 第十届蓝桥杯省赛总结(java b组一等奖)

    哈哈哈 来 先放图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190402193144750.jpg?x-oss-process=image/waterma ...

  9. 1229. 日期问题 Java题解 (枚举) 【第八届蓝桥杯省赛C++B组,JAVA B组】

    输入样例: 02/03/04 输出样例: 2002-03-04 2004-02-03 2004-03-02 解题思路: 可以顺着题意将三个数所有可能组成的情况枚举出来,并判断是否为合法的日期,将符合条 ...

最新文章

  1. Extjs--FormPanel(2)
  2. Flink批处理优化器之数据属性
  3. Linux通过使用Sambaserver示例
  4. python md5函数_python实现md5加密
  5. 微软发布 VS Code Jupyter 插件!不止 Python,多语言的 Jupyter Notebook支持来了!
  6. 随机生成A~Z的字母CharDemo
  7. 解决mysql地区时间错误_mysql time zone时区的错误解决
  8. mysql57介绍_MySQL5.7 JSON类型使用介绍
  9. 阿里云手机号短信设置
  10. 分享一个更高效的数据清理方法,建议收藏
  11. js-05--对象是什么、创建对象、对象使用、操作对象、遍历对象、内置对象、Math、任意范围随机数、日期对象、字符串对象
  12. swift 数组遍历 forEach 、enumerated、iterator、indices
  13. ROHS认证是什么?
  14. springboot+宿舍管理小程序 毕业设计-附源码171008
  15. w10系统服务器启动失败,三种方法教你解决Win10系统Apache启动失败问题
  16. 计算机配置里面没有网络选项,解决win10网络设置中没有以太网的方法
  17. 【第005问 Unity中如何显示三角形中心法线?】
  18. 学习笔记(19):零基础搞定Python数据分析与挖掘-常用的正则符号(二)
  19. Postgresql查询执行模块README笔记
  20. adb脚本选择语句_常用adb命令汇总(绝对干货)

热门文章

  1. 漫步数学分析三十九——隐函数定理
  2. Android实战—Broadcast音乐盒(三)
  3. 快速找出两个Word文档之间的差别
  4. -20dB谱宽是什么意思?
  5. 住建部发布《全国建筑工人管理服务信息平台数据对接方案》
  6. 推荐10个免费实用的资源网站,值得收藏
  7. AD 删除原理图图纸外的器件
  8. JavaScript 和读取服务器cookie
  9. 解决黑苹果和Windows双系统时,时钟不同步的问题
  10. 便宜的Android手机值得吗?