题目链接:http://118.190.20.162/view.page?gpid=T62

题目思路

  • mark数组用来存储第i号钥匙的位置,优先队列pq用来存取空挂钩的位置(每次取最左空位的时间复杂度为O(logn)O(logn)O(logn),比直接用线性表的O(n)O(n)O(n)要快速)
  • 我们把每次借用钥匙和归还钥匙的时刻都当作时间节点,这样我们就有2∗k2*k2∗k个时间节点。依照题意,我们按时间从早到晚,结合归还优先、钥匙编号小的优先策略对所有时间节点进行排序
  • 接下来,只要遍历所有的时间节点,模拟借钥匙和还钥匙的操作就可以了。如果是借钥匙操作,就把空位在优先队列中记录。否则,在优先队列中读取最左边空挂钩的位置,放回钥匙并把该位置移出优先队列。

代码如下

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int maxn = 2005;
//用于表示执行借用或者归还的时间点
struct Point{int id, Time, isRet;//isRet等于0表示借用,等于1表示归还
} a[maxn];
int n, k, w, s, c;
//mark[i]表示i存放的位置
int mark[maxn], res[maxn];
//小根堆,表示从左到右的空位
priority_queue<int, vector<int>, greater<int> > pq;bool cmp(const Point &A, const Point &B) {if (A.Time == B.Time) {if (A.isRet == B.isRet) {return A.id < B.id;} else {return A.isRet > B.isRet;}} else {return A.Time < B.Time;}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> k;for (int i = 1; i <= n; i++) mark[i] = i; for (int i = 1; i <= k; i++) {cin >> w >> s >> c;a[(i<<1)-1].id = w;a[(i<<1)-1].Time = s; //借用的时间节点a[(i<<1)-1].isRet = 0; a[i<<1].id = w;a[i<<1].Time = s + c; //归还的时间节点a[i<<1].isRet = 1; }sort(a + 1, a + k * 2 + 1, cmp);int x = 0, y = 0;for (int i = 1; i <= k * 2; i++) {int key = a[i].id;if (a[i].isRet) {//return the keymark[key] = pq.top();pq.pop();} else {// borrow the keypq.push(mark[key]);}}for (int i = 1; i <= n; i++) res[mark[i]] = i;for (int i = 1; i <= n; i++) cout << res[i] << " ";cout << endl;return 0;
}

ccf-csp #201709-2 公共钥匙盒相关推荐

  1. CCF 模拟题,公共钥匙盒

    题目描述: 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒 ...

  2. CSP认证201709-2 公共钥匙盒[C++题解]:结构体、排序、枚举

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 采用结构体来存每个操作,保存啥呢?三个成员:钥匙id:操作的类型:1表示还钥匙,0表示取钥匙:操作的时间tm: 然后结构体内部排序, ...

  3. python认证考试_Python入门习题(39)——CCF CSP认证考试真题:公共钥匙盒

    CCF CSP认证考试真题:共钥匙盒 问题描述 试题编号:201709-2 试题名称:公共钥匙盒 时间限制:1.0s 内存限制:256.0MB 问题描述 有一个学校的老师共用N个教室,按照规定,所有的 ...

  4. CSP CCF 201709-2 公共钥匙盒(C++)满分代码,有注释

    问题描述 试题编号: 201709-2 试题名称: 公共钥匙盒 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共 ...

  5. CCF CSP 公共钥匙盒 JAVA 201709-2 100分

    这道题做了几遍 感觉这次做得比较好的就是做好了每个函数的封装 无非使用了二维数组的排序  就变成了很简单的一道题 package csp2017_09_2;import java.util.Array ...

  6. csp ccf公共钥匙盒

    问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中 ...

  7. CCF CSP 公共钥匙盒

    问题描述 试题编号: 201709-2 试题名称: 公共钥匙盒 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共 ...

  8. ccf公共钥匙盒python_CCF python 201709-2 公共钥匙盒

    基本思路: 将所有的时间节点(借钥匙时间,还钥匙时间)组织到一个列表里[钥匙号,时间,借or还] 并将之按时间的升序.还优先借.钥匙号的升序排列 那么所要做的就是遍历这个列表: ····如果是借就 · ...

  9. csp试题2:公共钥匙盒

    csp试题2:公共钥匙盒 题目 分析 代码 总结 题目 问题描述       有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙 ...

  10. 公共钥匙盒(排序CCF)

    问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中 ...

最新文章

  1. 以AI制作AI,当AutoML加入AI研究员内卷大潮
  2. C语言 计算一串字符中出现的数字字符数
  3. Cacti迁移RRA数据迁移脚本
  4. [渗透测试]扫目录,Sqlmap利用均超时,利用dirb扫描
  5. day29 java 的IO流(2)
  6. spring boot(三) 集成mybatis
  7. Javascript第五章location对象第五课
  8. core部署iis的 调试net_ASP.NET Core环境变量和启动设置的配置教程
  9. java-第十一章-类的无参方法-模拟ATM机进行账户余额查询
  10. 蓝桥杯第十三届省赛题目(4月23日)答案汇总 python
  11. 如何清除项目 git 版本控制信息
  12. 51单片机学习代码(LED灯)
  13. 肠道重要菌属——嗜胆菌属 (Bilophila)喜欢脂肪、耐胆汁的促炎菌
  14. 什么是CDN?什么又是高防CDN?
  15. Vue3笔记_02setup与常用的Composition API(组合式API)
  16. Istio:服务发现和Pilot的架构机制
  17. 电子电路学习笔记(14)——LDO(低压差线性稳压器)
  18. 【小5聊】winform窗体之最小化事件捕捉以及最小化到任务栏功能
  19. 入门到卸载:Anaconda3安装与Python3.8.1兼容配置
  20. Java 8 的发展

热门文章

  1. [gic]-ARM gicv3/gicv4的详细介绍-2020/08
  2. linux dev_info,Linux命令集-xfs_info
  3. linux运行rmp文件,linux 里rpm包到底是干什么用的啊?
  4. Ubuntu配置静态ip联网总结
  5. 【网络安全】一次授权的渗透测试
  6. Windows消息机制学习笔记(三)—— 消息的接收与分发
  7. 012 背包二叉树遍历分析和代码编写
  8. 001 FSG 1.33变形壳
  9. MySQL删除数据表(DORP TABLE语句)
  10. 2015年蓝桥杯省赛题解