CCF-CSP 201709-2公共钥匙盒

import java.util.Collections;
import java.util.Scanner;
import java.util.Vector;
public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		//钥匙总量
		int N = s.nextInt();
		//K次借还
		int K = s.nextInt();
		//钥匙数组
		int[] key = new int[N];
		//给钥匙数组赋值 从1开始
		for(int i=1;i<=N;i++) {
			key[i-1]=i;
		}
		
		//找出最后一个老师归还的时刻
		int LastTime = 0;
		// 0为钥匙编号 1为开始上课的时间 2为归还钥匙的时刻
		int[][] arr = new int[K][3];
		for(int i=0;i<K;i++) {
			arr[i][0] = s.nextInt();
			arr[i][1] = s.nextInt();
			arr[i][2] = arr[i][1]+s.nextInt();
			if(arr[i][2]>LastTime) LastTime=arr[i][2];

		}
		//某个时刻需要借钥匙的老师们
		Vector jie = new Vector<Integer>();
		//某个时刻需要还钥匙的老师们
		Vector huan = new Vector<Integer>();
		//开始安排 从每个时刻开始遍历
		for(int i=1;i<=LastTime;i++) {
			//开始查找需要借或还的老师
			for(int j=0;j<K;j++) {
				//记录是几号钥匙
				if (arr[j][1]==i) jie.addElement(arr[j][0]);
				if(arr[j][2]==i) huan.addElement(arr[j][0]);
			}
			//如果没有借也没有还的 continue
			if(jie.isEmpty() && huan.isEmpty()) continue;
			//钥匙是先全还回去再取出,故先考虑还钥匙
			//如果有多位老师还钥匙,则他们按钥匙编号从小到大的顺序还。
			//给huan的vector排个序 此时数组的第一位就是最小的 最后一位是最大的
			Collections.sort(huan);
			
			while(!huan.isEmpty()) {
				for(int k = 0;k<N;k++) {
					//找到数组第一个空位,归还
					if(key[k]==-1) {
						//本次要还的钥匙 为huan的第一个
						int temp = (int)huan.elementAt(0);
						//huan移出
						huan.removeElementAt(0);
						key[k]=temp;
						break;
					}
				}
			}//此时还钥匙成功 老师开始取钥匙
			while(!jie.isEmpty()) {
				//本次要借的钥匙
				int temp = (int)jie.elementAt(0);
				jie.removeElementAt(0);
				for(int k=0;k<N;k++) {
					if(key[k]==temp) {
						key[k]=-1;
						break;
					}
				}
			}
		}
		//开始打印钥匙
		for(int k=0;k<N;k++) {
			System.out.print(key[k]+" ");
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值