本文主要是介绍CCF CSP认证 题解:201709-2 公共钥匙盒(Java语言原创),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
钥匙盒一共有 N个挂钩,从左到右排成一排,用来挂 N个教室的钥匙。一串钥匙没有固定的悬挂位置,但钥匙上有标识,所以老师们不会弄混钥匙。
每次取钥匙的时候,老师们都会找到自己所需要的钥匙将其取走,而不会移动其他钥匙。每次还钥匙的时候,还钥匙的老师会找到最左边的空的挂钩,将钥匙挂在这个挂钩上。如果有多位老师还钥匙,则他们按钥匙编号从小到大的顺序还。如果同一时刻既有老师还钥匙又有老师取钥匙,则老师们会先将钥匙全还回去再取出。
今天开始的时候钥匙是按编号从小到大的顺序放在钥匙盒里的。有 K位老师要上课,给出每位老师所需要的钥匙、开始上课的时间和上课的时长,假设下课时间就是还钥匙时间,请问最终钥匙盒里面钥匙的顺序是怎样的?
接下来 K行,每行三个整数 w, s, c,分别表示一位老师要使用的钥匙编号、开始上课的时间和上课的时长。可能有多位老师使用同一把钥匙,但是老师使用钥匙的时间不会重叠。
保证输入数据满足输入格式,你不用检查数据合法性。
4 3 3
2 2 7
每个关键时刻后的钥匙状态如下(X表示空):
时刻2后为1X345;
时刻3后为1X3X5;
时刻6后为143X5;
时刻9后为14325。
1 1 14
3 3 12
1 15 12
2 7 20
3 18 12
4 21 19
5 30 9
import java.util.Scanner;
public class Main{
public static void main(String args[]){
Scanner in=new Scanner(System.in);
int keys=in.nextInt();
int teachers=in.nextInt();
int key[]=new int[keys+1];
for(int i=0;i<=keys;i++){
key[i]=i;
}
int map[][]=new int[teachers][3];
int start=10000,end=0;
for(int i=0;i<teachers;i++){
for(int j=0;j<3;j++){
map[i][j]=in.nextInt();
}
if(map[i][1]<start)start=map[i][1];
map[i][2]+=map[i][1];
if(map[i][2]>end)end=map[i][2];
}
int []temp=new int[keys+1];
for(;start<=end;start++){
for(int i=0;i<=keys;i++)temp[i]=0;
for(int i=0;i<teachers;i++){
if(map[i][2]==start){
temp[map[i][0]]=1;//标记需还钥匙
}
}
for(int i=1;i<=keys;i++){//还钥匙
if(temp[i]==1)
for(int j=1;j<=keys;j++){
if(key[j]==0){
key[j]=i;
break;
}
}
}
for(int i=0;i<teachers;i++){//借钥匙
if(map[i][1]==start){
for(int j=1;j<=keys;j++){
if(key[j]==map[i][0]){
key[j]=0;
break;
}
}
}
}
}
for(int i=1;i<=keys;i++){
System.out.print(key[i]+" ");
}
}
}
这篇关于CCF CSP认证 题解:201709-2 公共钥匙盒(Java语言原创)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!