201709-2 公共钥匙盒 Java

思路:
按上课开始时间排一下序,一个时刻一个时刻判断要不要还钥匙,要不要借钥匙

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] + " ");
		}
	}
}

原文地址:https://www.cnblogs.com/yu-jiawei/p/12370694.html