前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CCF考试——201709-2公共钥匙盒

CCF考试——201709-2公共钥匙盒

作者头像
AI那点小事
发布2020-04-20 15:08:48
1810
发布2020-04-20 15:08:48
举报
文章被收录于专栏:AI那点小事

概要

问题描述

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


思路

这是道结构体排序的问题,构造结构体,包含3个元素,房间号,使用时间,类型(取钥匙为0,放钥匙为1)。排序规则:首先根据时间的先后排序。时间相同,根据取放排序,先放后取。时间相同,是相同的操作,先房间号低的操作。


AC代码

代码语言:javascript
复制
#include <iostream>
#include <vector> 
#include <algorithm> 
using namespace std;

typedef struct Action{
    int room;
    int time;       
    int type;   //0为put,1为get        
}Action;

int cmp(Action action1,Action action2)
{
    if(action1.time < action2.time){
        return 1;
    }else if(action1.time == action2.time 
            && action1.type < action2.type){
        return 1;
    }else if(action1.time == action2.time 
            && action1.type == action2.type
            && action1.room < action2.room){
            return 1;   
    }
    return 0;
}

int N,K;
int room,start,time;
int state[1001];
vector<Action> actions;

int main()
{
    while(cin>>N>>K){
        for(int i = 1 ; i <= N ; i++){
            state[i] = i;
        }
        for(int i = 0 ; i < K ; i++){
            cin>>room>>start>>time;
            Action action;
            action.room = room;
            action.time = start;
            action.type = 1;
            actions.push_back(action);
            action.type = 0;
            action.time = start+time;
            actions.push_back(action);  
        }
        sort(actions.begin(),actions.end(),cmp);
        for(int i = 0 ; i < actions.size(); i++){
            Action action = actions[i];
            if(action.type == 0){//put
                for(int j = 1 ; j <= N ; j++){
                    if(state[j] == -1){
                        state[j] = action.room;
                        break;
                    }
                }
            }else{//get
                for(int j = 1 ; j <= N ; j++){
                    if(state[j] == action.room){
                        state[j] = -1;
                        break;
                    }
                }
            }
        }
        for(int i = 1 ; i <= N ; i++){
            cout<<state[i]<<" ";
        }
    }

    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概要
  • 思路
  • AC代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档