1. 程式人生 > >CCF CSP 201709-2 公共鑰匙盒(Java-100分)

CCF CSP 201709-2 公共鑰匙盒(Java-100分)

問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。
  鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛N個教室的鑰匙。一串鑰匙沒有固定的懸掛位置,但鑰匙上有標識,所以老師們不會弄混鑰匙。
  每次取鑰匙的時候,老師們都會找到自己所需要的鑰匙將其取走,而不會移動其他鑰匙。每次還鑰匙的時候,還鑰匙的老師會找到最左邊的空的掛鉤,將鑰匙掛在這個掛鉤上。如果有多位老師還鑰匙,則他們按鑰匙編號從小到大的順序還。如果同一時刻既有老師還鑰匙又有老師取鑰匙,則老師們會先將鑰匙全還回去再取出。
  今天開始的時候鑰匙是按編號從小到大的順序放在鑰匙盒裡的。有K
位老師要上課,給出每位老師所需要的鑰匙、開始上課的時間和上課的時長,假設下課時間就是還鑰匙時間,請問最終鑰匙盒裡面鑰匙的順序是怎樣的?
輸入格式   輸入的第一行包含兩個整數NK
  接下來K行,每行三個整數wsc,分別表示一位老師要使用的鑰匙編號、開始上課的時間和上課的時長。可能有多位老師使用同一把鑰匙,但是老師使用鑰匙的時間不會重疊。
  保證輸入資料滿足輸入格式,你不用檢查資料合法性。
輸出格式   輸出一行,包含N個整數,相鄰整數間用一個空格分隔,依次表示每個掛鉤上掛的鑰匙編號。 樣例輸入 5 2
4 3 3
2 2 7
樣例輸出 1 4 3 2 5 樣例說明   第一位老師從時刻3開始使用4號教室的鑰匙,使用3單位時間,所以在時刻6還鑰匙。第二位老師從時刻2開始使用鑰匙,使用7單位時間,所以在時刻9還鑰匙。
  每個關鍵時刻後的鑰匙狀態如下(X表示空):
  時刻2後為1X345;
  時刻3後為1X3X5;
  時刻6後為143X5;
  時刻9後為14325。
樣例輸入 5 7
1 1 14
3 3 12
1 15 12
2 7 20
3 18 12
4 21 19
5 30 9
樣例輸出 1 2 3 5 4 評測用例規模與約定   對於30%的評測用例,1 ≤ NK ≤ 10, 1 ≤ w ≤ N, 1 ≤ sc ≤ 30;
  對於60%的評測用例,1 ≤ NK ≤ 50,1 ≤ w ≤ N,1 ≤ s ≤ 300,1 ≤ c ≤ 50;
  對於所有評測用例,1 ≤ NK ≤ 1000,1 ≤ w ≤ N,1 ≤ s ≤ 10000,1 ≤ c ≤ 100。
import java.util.ArrayList;
import java.util.Scanner;

/*
 * 1.利用集合存入教師資料,初始化鑰匙序列N, K:教師人數 時間記錄器:time, 集合儲存要歸還的鑰匙
 * 2.還鑰匙:根據當前時間判斷歸還鑰匙的老師,將鑰匙序號存入集合,排序,再依次放回陣列中
 * 3.取鑰匙:根據當前時間,判斷能使用鑰匙的老師,執行取鑰匙方法
 * 教師: w:鑰匙號    s:開始上課    c:上課時間    e:s+c 結束時間
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //存老師
        ArrayList<Teacher> arrt1 = new ArrayList<Teacher>();
        //存要歸還的鑰匙
        ArrayList<Integer> key = new ArrayList<Integer>();
        int time = 1;
        int N = sc.nextInt();
        int K = sc.nextInt();
        int[] arr = new int[N];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i + 1;
        }
        for (int i = 1; i <= K; i++) {
            Teacher t = new Teacher(sc.nextInt(), sc.nextInt(), sc.nextInt());
            arrt1.add(t);
        }
        //結束條件是當前時間大於最後一個老師上完課的時間
        while(time <= maxTime(arrt1)){
            returnKey(time, arrt1, arr, key);
            borrowKey(time, arrt1, arr);
            time++;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }

    public static void returnKey(int time, ArrayList<Teacher> arrt1, int[] arr, ArrayList<Integer> key) {
        //清空放置要歸還鑰匙的集合
        key.clear();
        //判斷這個時間是否有需要歸還鑰匙的老師
        for (int i = 0; i < arrt1.size(); i++) {
            if (arrt1.get(i).e == time) {
                key.add(arrt1.get(i).w);
            }
        }
        if (key.isEmpty()) {
            //沒有鑰匙則不歸還
            return;
        } else {
            //將要歸還的鑰匙從大到小排序
            for (int i = 0; i < key.size() - 1; i++) {
                for (int j = 0; j < key.size() - 1 - i; j++) {
                    if (key.get(j) > key.get(j + 1)) {
                        int temp = key.get(j);
                        key.set(j, key.get(j + 1));
                        key.set(j + 1, temp);
                    }
                }
            }
            //歸還鑰匙
            for (int i = 0, j = 0; i < arr.length; i++) {
                if(arr[i] == 0){
                    arr[i] = key.get(j);
                    if(key.size()-1 == j){
                        break;
                    }else{
                        j++;
                    }
                }
            }
        }
    }

    public static void borrowKey(int time, ArrayList<Teacher> arrt1, int[] arr){
        for (int i = 0; i < arrt1.size(); i++) {
            //判斷在當前時間能夠使用鑰匙的老師
            if(time == arrt1.get(i).s){
                //取走鑰匙
                for (int j = 0; j < arr.length; j++) {
                    if(arrt1.get(i).w == arr[j]){
                        arr[j] = 0;
                        break;
                    }
                }
            }
        }
    }

    public static int maxTime(ArrayList<Teacher> arrt1){
        int temp = 0;
        for (int i = 0; i < arrt1.size(); i++) {
            if(arrt1.get(i).e > temp){
                temp = arrt1.get(i).e;
            }
        }
        return temp;
    }
}

class Teacher {
    int w;
    int s;
    int c;
    int e;

    public Teacher(int w, int s, int c) {
        this.w = w;
        this.s = s;
        this.c = c;
        this.e = this.s + this.c;
    }
}

參考:

http://blog.csdn.net/zz2013215/article/details/78561461?reload

相關推薦

CCF CSP 201709-2 公共鑰匙Java-100

問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。   鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛N個教室的鑰匙。

CCF CSP 201803-2 碰撞的小球Java-100

問題描述 試題編號: 201803-2 試題名稱: 碰撞的小球 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   數軸上有一條長度為L(L為偶數)的線段,左端點在原點,

CCF CSP 201709-2 公共鑰匙

計算機 bsp break stat {} oom 不用 mes ack CCF計算機職業資格認證考試題解系列文章為meelo原創,請務必以鏈接形式註明本文地址 CCF CSP 201709-2 公共鑰匙盒 問題描述   有一個學校的老師共用N個教室,按照規定,所有的

CCF 201709-2公共鑰匙100 簡單粗暴的做法

問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。   鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛N個教室的鑰匙。一串鑰

(ccf模擬)201709-2公共鑰匙

blog markdown mem cpp mat turn emp AC back #include <iostream> #include<string> #include <algorithm> #include<sstrea

CCF考試——201709-2公共鑰匙

概要 問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。   鑰匙盒一共有N個掛鉤,從左到右排成一

python ccf題解 201709-2 公共鑰匙

問題描述 試題編號: 201709-2 試題名稱: 公共鑰匙盒 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒

csp 201709-2 公共鑰匙

題目 問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。   鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛N個教室的

201709-2-公共鑰匙-ccf

題目:http://118.190.20.162/view.page?gpid=T62 解題思路: /*         1.把鑰匙取走,鑰匙位置為空,         2.把鑰匙放回{    

CCF 201709-2 公共鑰匙

正確程式碼來源(ps:大家可以自己找) 總體思路就是根據題意解題,但是由於數字範圍限制,採用結構體更方便,但是我不太會用。。。看到很多解這個題的方法都是用結構體。 本來自己寫的是用for迴圈和if語句暴力解決問題,雖然可能是對的,但是提交後超時了,得了70分

CCF 201709-2公共鑰匙【模擬題】

試題編號: 201709-2 試題名稱: 公共鑰匙盒 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能

CCF-201709-2-公共鑰匙

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

201709-2 公共鑰匙

#include <iostream> #include <vector> #include <set> #include <vector> using namespace std; const int N=10101; const int M=10

CCF201709-2 公共鑰匙100【模擬+優先佇列】

試題名稱:公共鑰匙盒問題描述  有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。   鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛

201709-2 公共鑰匙 解題報告

#include<iostream> #include<algorithm> #include<vector> using namespace std; vector<int>in,out;//in為儲存還鑰匙的

CFF程式設計練習:公共鑰匙Java

CFF程式設計練習:公共鑰匙盒(Java) 問題描述:   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。   鑰匙盒一共有N個

CCF 201709-2公共鑰匙 優先佇列

CCF 201709-2  公共鑰匙盒                                                             問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次

CCF CSP公共鑰匙100

問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。   鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛N個教室的鑰匙。

CCF 公共鑰匙模擬、排序、優先佇列

問題描述 試題編號: 201709-2 試題名稱: 公共鑰匙盒 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒

CCF 2017-09-02 公共鑰匙

問題描述    有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。    鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛N個教室的鑰匙。一