CCF-201709-2-公共鑰匙盒
阿新 • • 發佈:2019-02-13
思路:
還有幾天就要考證了,把這題又刷了一遍,所以過來把舊程式碼替換了。
這題讓我們模擬老師們的存取鑰匙的過程,輸出最後鑰匙的擺放位置。每個時間點有拿和放鑰匙的操作,我們只需把每個時間點的拿和放操作存好就好辦了。先弄一個時間表,表裡存放時間點,在每個時間點裡存放有哪些鑰匙是拿的和放的。
程式說明:
timetable是存放Moment類的物件陣列,Moment類裡面有getList和putList,用來存某個時刻需要拿和放的鑰匙。類裡還有拿和放的操作。
具體流程:
1.存好資料
2.遍歷timetable,每個時刻先放鑰匙再取鑰匙
3.輸出鑰匙盒
import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;
public class 公共鑰匙盒練習 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int k = input.nextInt();
int[] keyBox = new int[n];
Moment[] timetable = new Moment[10200];//用來存放時刻的時間表
//初始化鑰匙盒
for (int i = 0 ; i < n; i++)
keyBox[i] = i + 1;
//初始化物件陣列timetable
for (int i = 0; i < timetable.length; i++)
timetable[i] = new Moment();
//把每個時刻的存取操作存在對應的時刻中
for (int i = 0; i < k; i++) {
int key = input.nextInt(); //該老師要用的鑰匙編號
int start = input.nextInt(); //該老師上課開始時間
int end = input.nextInt() + start; //下課時間
//往對應時刻裡存放要存取的鑰匙
timetable[start].getList.offer(key);
timetable[end].putList.offer(key);
}
//遍歷時間表,模擬存取操作
for (Moment m : timetable) {
//先放後取
m.put(keyBox);
m.get(keyBox);
}
//列印鑰匙盒
for (int key : keyBox)
System.out.print(key + " ");
}
}
//時刻類
class Moment {
LinkedList<Integer> putList = new LinkedList<>();//某時刻要放的鑰匙編號
LinkedList<Integer> getList = new LinkedList<>();//某時刻要取的鑰匙編號
Moment() {}
//某時刻的放操作
void put(int[] keyBox) {
if (!putList.isEmpty()) {
Collections.sort(putList);
for (int i = 0; i < keyBox.length; i++) {
if (keyBox[i] == 0 && !putList.isEmpty())
keyBox[i] = putList.poll();
}
}
}
//某時刻的取操作
void get(int[] keyBox) {
while (!getList.isEmpty()) {
int mK = getList.poll();
for (int i = 0; i < keyBox.length; i++) {
if (mK == keyBox[i])
keyBox[i] = 0;
}
}
}
}