问题描述
  有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,
上完课后,再将钥匙放回到钥匙盒中。
  钥匙盒一共有N个挂钩,从左到右排成一排,用来挂N个教室的钥匙。一串钥匙没有固定的悬挂位置,但钥匙上有标识,所以老师们不会弄混钥匙。
  每次取钥匙的时候,老师们都会找到自己所需要的钥匙将其取走,而不会移动其他钥匙。每次还钥匙的时候,还钥匙的老师会找到最左边的空的挂钩,将钥匙挂在这个挂钩上。
如果有多位老师还钥匙,则他们按钥匙编号从小到大的顺序还。如果同一时刻既有老师还钥匙又有老师取钥匙,则老师们会先将钥匙全还回去再取出。
  今天开始的时候钥匙是按编号从小到大的顺序放在钥匙盒里的。有K位老师要上课,给出每位老师所需要的钥匙、开始上课的时间和上课的时长,假设下课时间就是还钥匙时间,
请问最终钥匙盒里面钥匙的顺序是怎样的?
输入格式
  输入的第一行包含两个整数N, K。
  接下来K行,每行三个整数w, s, c,分别表示一位老师要使用的钥匙编号、开始上课的时间和上课的时长。可能有多位老师使用同一把钥匙,但是老师使用钥匙的时间不会重叠。
  保证输入数据满足输入格式,你不用检查数据合法性。
输出格式
  输出一行,包含N个整数,相邻整数间用一个空格分隔,依次表示每个挂钩上挂的钥匙编号。
样例输入
5 2
4 3 3
2 2 7
样例输出
1 4 3 2 5
样例说明
  第一位老师从时刻3开始使用4号教室的钥匙,使用3单位时间,所以在时刻6还钥匙。第二位老师从时刻2开始使用钥匙,使用7单位时间,所以在时刻9还钥匙。
  每个关键时刻后的钥匙状态如下(X表示空):
  时刻2后为1X345;
  时刻3后为1X3X5;
  时刻6后为143X5;
  时刻9后为14325。
样例输入
5 7
1 1 14
3 3 12
1 15 12
2 7 20
3 18 12
4 21 19
5 30 9
样例输出
1 2 3 5 4
评测用例规模与约定
  对于30%的评测用例,1 ≤ N, K ≤ 10, 1 ≤ w ≤ N, 1 ≤ s, c ≤ 30;
  对于60%的评测用例,1 ≤ N, K ≤ 50,1 ≤ w ≤ N,1 ≤ s ≤ 300,1 ≤ c ≤ 50;
  对于所有评测用例,1 ≤ N, K ≤ 1000,1 ≤ w ≤ N,1 ≤ s ≤ 10000,1 ≤ c ≤ 100。

思路:用教师类封装每次输入的开始时间,结束时间,以及存放钥匙的编号。用数组模拟挂钩,如果钥匙被拿走,数组位置的值就置为0,钥匙被放进去数组位置置为该钥匙编号。从最开始时间到结束时间开始循环,得到每个时刻钥匙位置的状态。输出最终时间的状态。

刚开始没有考虑到两个老师同时放钥匙的情况,所以只得了30分,修改之后得100昏!这种情况我是将放钥匙的老师全部放入链表中并将链表排序,然后循环链表让老师进行放钥匙操作。

具体见代码注释:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner; public class PublicKey {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int locNum = sc.nextInt();// 挂钩数量
int teaNum = sc.nextInt();// 教师数量
int minTime = 10000;// 时间轴开始时间
int maxTime = 0;// 时间轴结束时间
List<Teacher> teaList = new ArrayList<Teacher>();// 老师的数组
int locations[] = new int[locNum];//用数组模拟挂钩,如果钥匙被拿走,数组位置的值就置为0,钥匙被放进去数组位置置为该钥匙编号。
//初始化教师链表,将教师行为先全部存入链表中
for (int i = 0; i < teaNum; i++) {
int keyNum = sc.nextInt();
int startTime = sc.nextInt();
int endTime = startTime + sc.nextInt();
minTime = Math.min(minTime, startTime);
maxTime = Math.max(maxTime, endTime);
Teacher tea = new Teacher(keyNum, startTime, endTime);
teaList.add(tea);
}
// 初始位置数组
for (int i = 0; i < locNum; i++) {
locations[i] = i+1;
}
// 开始时间轴循环
for (int i = minTime; i <= maxTime; i++) {
List<Teacher> reTeaList = new ArrayList<Teacher>();
reTeaList.clear();
for(int j =0; j <teaList.size(); j++){
// 多位老师同时还钥匙的情况
if(teaList.get(j).getEndTime() == i){
reTeaList.add(teaList.get(j));//将还钥匙的老师入队
}
}
//按钥匙编号排序
Collections.sort(reTeaList,new sortByKeyNum());
//判断某一时刻是否有老师放钥匙
for(Teacher t:reTeaList){
int currKeyNum = t.getKeyNum();//当前老师持有的钥匙编号
//找到第一个位置为0的地方放进去
for(int k = 0; k< locations.length; k++){
if(locations[k] == 0){
locations[k] = currKeyNum;
//跳出本次循环
break;
}
}
}
for(int j = 0; j < teaList.size(); j++){
//判断某一时刻是否有老师拿钥匙出去
if(teaList.get(j).getStartTime() == i){
int currKeyNum = teaList.get(j).getKeyNum();//老师需要的钥匙编号
//找到钥匙所在的位置
for(int k = 0; k< locations.length; k++){
if(locations[k] == currKeyNum){
//取出钥匙并将该位置置为0
locations[k] = 0;
//跳出本次循环
break;
}
}
}
}
}
//输出位置数组
for(int i = 0; i<locations.length; i++){
System.out.print(locations[i]+" ");
}
}
}
/**
* 按钥匙编号进行排序,用迭代器实现
* @author Administrator
*
*/ class sortByKeyNum implements Comparator{ public int compare(Object o1, Object o2) {
if(((Teacher)o1).getKeyNum()>((Teacher)o2).getKeyNum()){
return 1;
}
return -1;
} }
/**
* 教师类
* @author Administrator
*
*/
class Teacher {
private int keyNum;//需要操作的钥匙编号
private int startTime;//开始操作的时间
private int endTime;//结束操作的时间 public Teacher() {
super();
} public Teacher(int keyNum, int startTime, int endTime) {
super();
this.keyNum = keyNum;
this.startTime = startTime;
this.endTime = endTime;
} public int getKeyNum() {
return keyNum;
} public void setKeyNum(int keyNum) {
this.keyNum = keyNum;
} public int getStartTime() {
return startTime;
} public void setStartTime(int startTime) {
this.startTime = startTime;
} public int getEndTime() {
return endTime;
} public void setEndTime(int endTime) {
this.endTime = endTime;
} }

CCF 201709-2公共钥匙盒的更多相关文章

  1. CCF CSP 201709-2 公共钥匙盒

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-2 公共钥匙盒 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须 ...

  2. CCF 2017 09-02 公共钥匙盒

     CCF 2017 09-02 公共钥匙盒 1.用快速排序函数结合排序规则函数来给取放排序. 2.vector数组的强大功能. #include<iostream> #include< ...

  3. (ccf模拟)201709-2公共钥匙盒

    #include <iostream> #include<string> #include <algorithm> #include<sstream> ...

  4. CCF 2017-09-2 公共钥匙盒

    CCF 2017-09-2 公共钥匙盒 题目 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上课的教室 ...

  5. 公共钥匙盒(CCF)【模拟】

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

  6. 公共钥匙盒 ccf

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

  7. CCF(公共钥匙盒):思维+模拟

    公共钥匙盒 201709-2 这题的思路一开始不是很清晰,一开始想用贪心去做.但是发现按照题目的思路不对.所以这里采用的是类似于多项式的加减的处理. #include<iostream> ...

  8. csp公共钥匙盒

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

  9. ccf-201709-2 公共钥匙盒

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

随机推荐

  1. Dynamics 365 App for Outlook 与 Dynamics 365 for Outlook(已被弃用)

    在最新的版本中Dynamics 365 for Outlook(Outlook 客户端)已被弃用 随 Dynamics CRM 2016(版本 8.0)引入的 Dynamics 365 App for ...

  2. 关于 eval 的报错 Uncaught ReferenceError: False is not defined

    var obj ={'id': 16, 'name': '管理员', 'delflag': False, 'grade': 1000000.0}VM3614:1 Uncaught ReferenceE ...

  3. Spring Boot—17MongoDB

    在MongoDB中插入如下的数据 db.baike.insert( { _id: 'freemark', desc: '新一代模板语言', tag: [ 'IT', '模板语言' ], comment ...

  4. Spring Boot—14JdbcTemplate

    pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  5. CentOS7系列--1.3CentOS7用户管理

    CentOS7用户管理 1. 添加用户 [root@centos7 ~]# useradd jack [root@centos7 ~]# passwd jack Changing password f ...

  6. 利用GDAL从内存中直接解析图像数据

    对于网络数据源,调度中可以把数据写入本地,然后读取本地数据格式进行影像的解析(地形有时候也用tif等格式). 此种方式会每次调度进行不必要的IO开销和时间花费. GDAL提供了相应的接口,直接从内存中 ...

  7. Linux 网络流量查看 Linux ip traffic monitor

    Network monitoring on Linux This post mentions some linux command line tools that can be used to mon ...

  8. 润乾报表JSF FORM 标签中使用填报表解决方案

     需求 润乾报表的标签需要在jsf页面中和其他填报控件一起使用,润乾报表负责展现录入部分数据,并且这部分数据和页面的其它控件的数据存在前台和后台的交互. 问题 润乾报表在前台会生成自己的form, ...

  9. 对象的数据属性(Object)

    value: 对象属性的默认值,默认值为undefined configurable: 能否使用delete.能否需改属性特性.或能否修改访问器属性.,false为不可重新定义,默认值为true en ...

  10. show tables from information_schema/performance_schema/sys;

    root@localhost:3306.sock [performance_schema]>select version();+------------+| version()  |+----- ...