思路:
按上课开始时间排一下序,一个时刻一个时刻判断要不要还钥匙,要不要借钥匙
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();//N把钥匙
int K = sc.nextInt();//K次操作
int key[] = new int[N];
for(int i=0;i<N;i++) {//给钥匙编号
key[i] = i+1;
}
//存储上课信息
int mes[][] = new int[K][3];
//找出最晚结束的课
int max = 0;
for(int i=0;i<K;i++) {
mes[i][0] = sc.nextInt();//钥匙编号
mes[i][1] = sc.nextInt();//上课开始
mes[i][2] = sc.nextInt() + mes[i][1];//下课结束时刻
if(mes[i][2] > max) {
max = mes[i][2];
}
}
//按上课开始时间排序,选择排序
for(int i=0;i<K;i++) {
int min = i;
for(int j=i+1;j<K;j++) {
if(mes[j][1] < mes[i][1]) {
min = j;
}
}
if(min != i) {//把最小的放到排好序的最后
int temp[] = mes[min];
mes[min] = mes[i];
mes[i] = temp;
}
}
//拿钥匙,到最后一节课结束
for(int i=1;i<=max;i++) {
//每一时刻应还钥匙的集合
List<Integer> back = new ArrayList<Integer>();
for(int j=0;j<K;j++) {
if(mes[j][2] == i) {
back.add(mes[j][0]);
}
}
Collections.sort(back);//钥匙从小到大排序
//先全部还完钥匙
for(int j=0;j<back.size();j++) {
for(int k=0;k<N;k++) {
if(key[k] == 0) {
key[k] = back.get(j);
break;
}
}
}
//借钥匙
for(int j=0;j<K;j++) {
if(mes[j][1] == i) {
for(int k=0;k<N;k++) {
if(key[k] == mes[j][0]) {
key[k] = 0;
}
}
}
}
}
sc.close();
//打印
for(int i=0;i<N;i++) {
System.out.print(key[i] + " ");
}
}
}