1. 程式人生 > >CCF-201709-2-公共鑰匙盒

CCF-201709-2-公共鑰匙盒

思路:

還有幾天就要考證了,把這題又刷了一遍,所以過來把舊程式碼替換了。
這題讓我們模擬老師們的存取鑰匙的過程,輸出最後鑰匙的擺放位置。每個時間點有拿和放鑰匙的操作,我們只需把每個時間點的拿和放操作存好就好辦了。先弄一個時間表,表裡存放時間點,在每個時間點裡存放有哪些鑰匙是拿的和放的。

程式說明:

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; } } } }