1. 程式人生 > >【CCF 201709-2】 公共鑰匙盒 (優先佇列)

【CCF 201709-2】 公共鑰匙盒 (優先佇列)

CCF 201709-2  公共鑰匙盒                                                            

問題描述

  有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。
  鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛N個教室的鑰匙。一串鑰匙沒有固定的懸掛位置,但鑰匙上有標識,所以老師們不會弄混鑰匙。
  每次取鑰匙的時候,老師們都會找到自己所需要的鑰匙將其取走,而不會移動其他鑰匙。每次還鑰匙的時候,還鑰匙的老師會找到最左邊的空的掛鉤,將鑰匙掛在這個掛鉤上。如果有多位老師還鑰匙,則他們按鑰匙編號從小到大的順序還。如果同一時刻既有老師還鑰匙又有老師取鑰匙,則老師們會先將鑰匙全還回去再取出。
  今天開始的時候鑰匙是按編號從小到大的順序放在鑰匙盒裡的。有K位老師要上課,給出每位老師所需要的鑰匙、開始上課的時間和上課的時長,假設下課時間就是還鑰匙時間,請問最終鑰匙盒裡面鑰匙的順序是怎樣的?

輸入格式

  輸入的第一行包含兩個整數N, K。
  接下來K行,每行三個整數w, s, c,分別表示一位老師要使用的鑰匙編號、開始上課的時間和上課的時長。可能有多位老師使用同一把鑰匙,但是老師使用鑰匙的時間不會重疊。
  保證輸入資料滿足輸入格式,你不用檢查資料合法性。

輸出格式

  輸出一行,包含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 ≤ N, K ≤ 10, 1 ≤ w ≤ N, 1 ≤ s, c ≤ 30;
  對於60%的評測用例,1 ≤ N, K ≤ 50,1 ≤ w ≤ N,1 ≤ s ≤ 300,1 ≤ c ≤ 50;
  對於所有評測用例,1 ≤ N, K ≤ 1000,1 ≤ w ≤ N,1 ≤ s ≤ 10000,1 ≤ c ≤ 100。

#include <iostream>
#include <queue>
using namespace std;
const int nmax=100;
int hook[nmax+1];

struct node{
    int num;
    char op; //操作:'L'-取鑰匙lend,'R'-還鑰匙return
    int timep;//時間點

    bool operator<(const node& rhs)const {
        if(timep!=rhs.timep){      
            return timep>rhs.timep;//如果多個人先後還,優先輸出借書時間小的
        }
        else if(op!=rhs.op){//如果同一時刻既有人還,又有人借,先全部還書再借
            return op<rhs.op;//同一時刻既有還又有借,優先輸出還的,即字元值大的
        }
        else{//如果多個人同時還,優先輸出鑰匙編號小的
            return num>rhs.num;
        }
    }
};
int main() {
    priority_queue<node>q;
    node nd;
    int n,m;//n為hook陣列的長度,m次操作
    int num,start,len;//num一位老師要使用的鑰匙編號、start開始上課的時間和上課的時長len
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        hook[i]=i;//先初始化各個鑰匙
    }

    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&num,&start,&len);
        nd.num=num;
        nd.timep=start;
        nd.op='L';
        q.push(nd);

        nd.op='R';
        nd.timep=start+len;
        q.push(nd);
    }
    while(!q.empty()){
        nd=q.top();
        q.pop();
        if(nd.op=='L'){
            for(int i=1;i<=n;i++){
                if(hook[i]==nd.num){//如果hook數組裡有要取走的鑰匙
                    hook[i]=0;
                    break;
                }
            }
        }
        else {//if(NODE.op=='R'){
            for(int i=1;i<=n;i++){
                if(hook[i]==0){//如果hook數組裡該位置是空的,則還鑰匙
                    hook[i]=nd.num;
                    break;
                }
            }
        }
        /*printf("status: ");
        for(int i=1; i<=n; i++)//輸出中間每次借和還的中間結果
            printf("%d ", hook[i]);
        printf("\n");*/
    }
    for(int i=1; i<=n; i++) {
        printf("%d ", hook[i]);
    }
    printf("\n");
    return 0;
}

相關推薦

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

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

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

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

CCF CSP公共鑰匙100分

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

CCF公共鑰匙

each vector span {} 不用 ext 相同 out 說明 問題描述   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裏,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裏找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙

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

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

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

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

CCF 2017-09-02 公共鑰匙

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

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

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

CCF 201709-4通訊網路Warshall 65分

思路 用warshall演算法求傳遞閉包,之後遍歷鄰接矩陣計算有幾個部門能夠訪問到N個部門 O(n^3),顯然超時,但是程式碼量短,水一點分數還是很值的。 Warshall有兩個版本,其中第一

2018.10.25 uoj#308. UNR #2UOJ拯救計劃排列組合

傳送門 有一個顯然的式子:Ans=∑A(n,i)∗用i種顏色的方案數Ans=\sum A(n,i)*用i種顏色的方案數Ans=∑A(n,i)∗用i種顏色的方案數 這個東西貌似是個NPCNPCNPC。 於

CCF 201809-4再買菜差分約束/DP

題意 問題描述   在一條街上有n個賣菜的商店,按1至n的順序排成一排,這些商店都賣一種蔬菜。   第一天,每個商店都自己定了一個正整數的價格。店主們希望自己的菜價和其他商店的一致,第二天,每一家商店都會根據他自己和相鄰商店的價格調整自己的價格。具體的,每家商店都會將第二

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

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

內存分析內存分析未完成

lan 初始 println 9.png 內存空間 需要 地址 idt student 棧的特點如下:   1. 棧描述的是方法執行的內存模型。每個方法被調用都會創建一個棧幀(存儲局部變量、操作數、方法出口等)   2. JVM為每個線程創建一個棧,用於存放該線程執行方法的

面向物件林老師版:抽象類十二

一、為什麼要有抽象類 1 、什麼是抽象類 與java一樣,python也有抽象類的概念但是同樣需要藉助模組實現,抽象類是一個特殊的類,它的特殊之處在於只能被繼承,不能被例項化 2 、為什麼要有抽象類 如果說類是從一堆物件中抽取相同的內容而來的,那麼抽象類就是從一堆類中抽取相同的內容而來的,內容包括資料

2018.11.06NOIP2014洛谷P1941飛揚的小鳥揹包問題

傳送門 解析: 知道是揹包後應該比較好像,但是這道題最難的應該就是看出這是一道揹包問題。。。 思路; 考慮用 f [

排序演算法1雙向氣泡排序雞尾酒排序

總結一下最近學習的幾個排序演算法 一開始找的是氣泡排序,在網上找資料時發現了這個雞尾酒排序,比較有意思。 雞尾酒排序就是雙向氣泡排序 先找到最小的數字,把他放到第一位,然後找到最大的數字,放到最後一位。 然後再找第二小的數字放到第二位,再找第二大的數字放到倒數第二位,以此類推,直到完

PHP學習筆記Laravel動態路由自動路由

動態路由有利有弊, 利 方便,可不用配置路由 。。。。。。好像沒了 弊 寫了很多controller,不太方便檢視到底有多少對外暴露的介面。 不方便對不同介面設定不同規則 不方便自定義請求方式等 。。。。以及很多不方便的弊端

Java集合類LinkedList原始碼分析jdk1.8

ArrayList和LinkedList是List介面的兩種實現,具有相同的查詢、插入、刪除操作,只是底層的實現方式不一樣。LinkedList是以雙向連結串列形式實現的集合類。 其增刪操作由於不需要移

第三章 暫存器記憶體訪問總結

3.1.記憶體中字的儲存 1.概念:CPU中,用16位暫存器來儲存一個字,即一個只要用兩個地址連續的記憶體單元來存放。 2.字單元:存放一個字型資料(16位)的記憶體單元,由兩個地址連續的記憶體單元組成。     通常情況下,我們將起始地址為N的字單元簡稱為N地址單元。 3.2.D