做这个题目一定要注意题目中的这个条件:“可能有多位老师使用同一把钥匙,但是老师使用钥匙的时间不会重叠”。参加考试的时候,忽略了这个条件,又弄队列什么的,最终只得了三十分。
代码是参考大佬的,下面给出大佬博客的链接,分析的很详细,这次就偷下懒。
链接:https://blog.csdn.net/zz2013215/article/details/78561461?reload
我的代码:
import java.util.*;
public class Main {
static class Teacher{
public int w;
public int s;
public int c;
public int e;
public Teacher(int w,int s,int c){
this.w = w;
this.s = s;
this.c = c;
this.e = s+c;
}
}
public static int max_time(ArrayList<Teacher> t){
int max = -999;
for(int i=0;i<t.size();i++)
if(max < t.get(i).e)
max = t.get(i).e;
return max;
}
public static void return_key(int time,ArrayList<Teacher> t,ArrayList<Integer> tmpkey,int[] key){
//清除要归还的钥匙
tmpkey.clear();
for(int i=0;i<t.size();i++){
if(t.get(i).e == time){
tmpkey.add(t.get(i).w);
}
}
if (tmpkey.isEmpty())
return;
else{
//按照编号进行从小到大排序
for(int i=0;i<tmpkey.size()-1;i++){
for(int j=0;j<tmpkey.size()-i-1;j++){
if(tmpkey.get(j+1)<tmpkey.get(j)){
int tmp = tmpkey.get(j);
tmpkey.set(j,tmpkey.get(j+1));
tmpkey.set(j+1,tmp);
}
}
}
//归还钥匙
for(int i=0,j=0;i<key.length;i++){
if(key[i] == 0){
key[i] = tmpkey.get(j);
if(j == tmpkey.size()-1)
break;
else{
j++;
}
}
}
}
}
public static void borrow_key(int time,ArrayList<Teacher> t,int[] key){
for(int i=0;i<t.size();i++){
if(time == t.get(i).s){
for(int j=0;j<key.length;j++){
if (key[j] == t.get(i).w){
key[j] = 0;
break;
}
}
}
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int K = sc.nextInt();
ArrayList<Teacher> teachers = new ArrayList<Teacher>();//老师集合
ArrayList<Integer> return_key = new ArrayList<Integer>();//归还钥匙的集合
int key[] = new int[N];//钥匙集合
for(int i=0;i<N;i++){
key[i] = i+1;
}
for(int i=0;i<K;i++){
Teacher t = new Teacher(sc.nextInt(),sc.nextInt(),sc.nextInt());
teachers.add(t);
}
int time = 1;
while(time<=max_time(teachers)){
return_key(time,teachers,return_key,key);
borrow_key(time,teachers,key);
time++;
}
for(int i=0;i<N;i++)
System.out.print(key[i]+" ");
}
}