• CSP 公共钥匙盒


    问题描述

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

    分析:

    • 对钥匙盒的操作只有取钥匙和放钥匙,这个过程中的参数有:钥匙的id、取/放钥匙的时间、是取还是放
    • 取钥匙要知道指定id的钥匙所在位置
    • 放钥匙要找到左面第一个空位的位置
    • pos[i]表明编号为i的钥匙的位置,has[i]表明i位置是否有钥匙,code[i]存放最终结果
    • 根据输入,对每个取/放钥匙的操作进行排序,优先级分别为:操作的时间升序、放钥匙优先、编号小的优先
    #include <bits/stdc++.h>
    using namespace std;
    int n,k,w,s,c,num;
    struct xxx{
        int id,time,bo;
    }node[2005];
    const int maxn = 1005;
    int pos[maxn],has[maxn],code[maxn];
    bool cmp(xxx a,xxx b)
    {
        if(a.time!=b.time) return a.time<b.time;
        else if(a.bo!=b.bo) return a.bo>b.bo;
        else return a.id<b.id;
    }
    
    void full(int a,int b,int c)
    {
        node[num].id=a;
        node[num].time=b;
        node[num].bo=c;
        num++;
    }
    
    void input()
    {
        for(int i=0;i<maxn;i++)
            has[i]=1,pos[i]=i;
        cin>>n>>k;
        num=0;
        while(k--)
        {
            cin>>w>>s>>c;
            full(w,s,0);
            full(w,s+c,1);
        }
        sort(node,node+num,cmp);
    
    }
    
    int find()
    {
        for(int i=1;i<=n;i++)
        {
            if(has[i]==0) return i;
        }
        return 0;
    }
    
    void solve()
    {
        for(int i=0;i<num;i++)
        {
            int id = node[i].id;
            int bo = node[i].bo;
            if(bo==1){  // 放钥匙
                int x = find(); //找到一个空位,把钥匙放进去
                pos[id]=x;
                has[x]=1;
            }
            else{
                int x = pos[id];
                has[x]=0;
            }
        }
    
    }
    
    int main()
    {
        input();
        solve();
        for(int i=1;i<=n;i++)
        {
            int x = pos[i];
            code[x]=i;
    
        }
        for(int i=1;i<=n;i++)
            cout<<code[i]<<" ";
        return 0;
    }
    
    
    落霞与孤鹜齐飞,秋水共长天一色
  • 相关阅读:
    POJ 1469 COURSES 二分图最大匹配
    POJ 1325 Machine Schedule 二分图最大匹配
    USACO Humble Numbers DP?
    SGU 194 Reactor Cooling 带容量上下限制的网络流
    POJ 3084 Panic Room 求最小割
    ZOJ 2587 Unique Attack 判断最小割是否唯一
    Poj 1815 Friendship 枚举+求最小割
    POJ 3308 Paratroopers 最小点权覆盖 求最小割
    1227. Rally Championship
    Etaoin Shrdlu
  • 原文地址:https://www.cnblogs.com/star-and-me/p/9623963.html
Copyright © 2020-2023  润新知