我覺得是第二題裏面最難的,然後這次認證的第三題也是我覺得最難的😂,不過好像第四題和第五題可以騙點分。
用TreeMap來存儲所有的時間點及該時間點要還和要借的鑰匙,其中不論是借的還是還的鑰匙也用TreeSet來存。這些都是爲了達到排序的效果。思路就是遍歷時間點,每個時間點先還鑰匙,然後借鑰匙。
奉上java滿分代碼
import java.util.*;
public class Main{
static class TimeSection{
public TreeSet<Integer> getKeys = new TreeSet<>();
public TreeSet<Integer> bacKeys = new TreeSet<>();
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String[] firstLine = scanner.nextLine().split(" ");
int n = Integer.parseInt(firstLine[0]);
int k = Integer.parseInt(firstLine[1]);
List<Integer> keys = new ArrayList<>();
for(int i = 0; i < n; i++){
keys.add(i + 1);
}
TreeMap<Integer, TimeSection> map = new TreeMap<>();
for(int i = 0; i < k; i++){
String[] data = scanner.nextLine().split(" ");
int key = Integer.parseInt(data[0]);
int start = Integer.parseInt(data[1]);
int end = Integer.parseInt(data[2]) + start;
{
TimeSection startSection = new TimeSection();
if(map.containsKey(start)){
startSection = map.get(start);
}
startSection.getKeys.add(key);
map.put(start, startSection);
}
{
TimeSection endSection = new TimeSection();
if(map.containsKey(end)){
endSection = map.get(end);
}
endSection.bacKeys.add(key);
map.put(end, endSection);
}
}
scanner.close();
for(Iterator<Integer> iterator = map.keySet().iterator(); iterator.hasNext();){
TimeSection timeSection = map.get(iterator.next());
for(int key : timeSection.bacKeys){
for(int i = 0; i < keys.size(); i++){
if(keys.get(i) == -1){
keys.set(i, key);
break;
}
}
}
for(int key : timeSection.getKeys){
for(int i = 0; i < keys.size(); i++){
if(keys.get(i) == key){
keys.set(i, -1);
break;
}
}
}
}
for(int key : keys){
System.out.print(key + " ");
}
}
}