zoukankan      html  css  js  c++  java
  • CCF CSP 201709-2 公共钥匙盒

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址

    CCF CSP 201709-2 公共钥匙盒

    问题描述

      有一个学校的老师共用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。

    解析

    题目的核心是把每一个上下课表示成两个取放钥匙的动作,然后对动作进行排序。

    首先根据时间的先后排序。

    时间相同,根据取放排序,先放后取。

    时间相同,是相同的操作,先房间号低的操作。

    具体来说,需要构建一个Action对象,同时定义operator<方法。

    代码

    C++

    #include <stdio.h>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    struct Action {
        int room;
        int time;
        int type; // 0:put, 1:get
        Action(int room_, int time_, int type_) : room(room_), time(time_), type(type_) {}
        bool operator<(const Action &other) const {
            if(time<other.time) return true;
            else if(time==other.time && type<other.type) return true;
            else if(time==other.time && type==other.type && room<other.room) return true;
            return false;
        }
    };
    
    int main() {
        int N, K;
        scanf("%d%d", &N, &K);
        vector<Action> actions;
        vector<int> states(N+1);
        for(int n=1; n<=N; n++) states[n] = n;
        
        for(int k=0; k<K; k++) {
            int room, begin, length;
            scanf("%d%d%d", &room, &begin, &length);
            actions.push_back(Action(room, begin, 1));
            actions.push_back(Action(room, begin+length, 0));
        }
        sort(actions.begin(), actions.end());
        for(int i=0; i<actions.size(); i++) {
            Action &act = actions[i];
            if(act.type == 0) { // put
                for(int n=1; n<=N; n++) {
                    if(states[n] == -1) {
                        states[n] = act.room;
                        break;
                    }
                }
            }
            else { // get
                for(int n=1; n<=N; n++) {
                    if(states[n] == act.room) {
                        states[n] = -1;
                        break;
                    }
                }
            }
        }
        for(int n=1; n<=N; n++) {
            printf("%d ", states[n]);
        }
    }
  • 相关阅读:
    mysql修改数据表名
    HDU 5742 It's All In The Mind (贪心)
    HDU 5752 Sqrt Bo (数论)
    HDU 5753 Permutation Bo (推导 or 打表找规律)
    HDU 5762 Teacher Bo (暴力)
    HDU 5754 Life Winner Bo (博弈)
    CodeForces 455C Civilization (并查集+树的直径)
    CodeForces 455B A Lot of Games (博弈论)
    CodeForces 455A Boredom (DP)
    HDU 4861 Couple doubi (数论 or 打表找规律)
  • 原文地址:https://www.cnblogs.com/meelo/p/7646680.html
Copyright © 2011-2022 走看看