微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CCF 201709-2 公共钥匙盒

这道题开始是没思路的,看了一下题解。说是把时间抽象成时间点(主要思想)。

让计算机计算的是某个时刻发生的事情,不需要管一段时间发生了什么。这样也不好思考

自己写了,没过。感觉写的太乱。于是还是在网上找了一篇,说到了优先队列

关键点:优先队列  模拟

优先队列的英文:priority_queue

优先队列的方法

  • top 访问队头元素
  • empty 队列是否为空
  • size 返回队列内元素个数
  • push 插入元素到队尾 (并排序)
  • emplace 原地构造一个元素并插入队列
  • pop 弹出队头元素
  • swap 交换内容

 

注意:重载方法中的

friend bool operator < (node a, node b) {
        if(a.time != b.time) {
            return a.time > b.time;
        } else if(a.op != b.op) {
            return a.op < b.op;
        } else {
            return a.id > b.id;
        }
    }

 

//只有<重载操作符函数时,如果将<改为>为什么不行,出现error C2784的错误
    friend bool operator <(Node node1,Node node2)
    {
        //<为从大到小排列,>为从小到大排列
        return node1.key<node2.key;
    }
    friend bool operator >(Node node1,Node node2)
    {
        return node1.key<node2.key;
    }

 完整代码

#include<iostream>
#include<queue>
using namespace std;
struct node {
    int id;
    int time;
    char op;
    friend bool operator < (node a, node b) {
        if(a.time != b.time) {
            return a.time > b.time;
        } else if(a.op != b.op) {
            return a.op < b.op;
        } else {
            return a.id > b.id;
        }
    }
};
int main() {
    int a[10004];
    node t;
    priority_queue<node> q;
    int n,k;
    cin >> n >> k;
    for(int i=1 ; i <= n ; i++) {
        a[i] = i;
    }
    int w,s,c;
    for(int i = 1 ; i <= k ; i++) {
        cin >> w >> s >> c;
        t.id = w;
        t.time = s;
        t.op = 'G';
        q.push(t);
        t.time = s + c;
        t.op = 'R';
        q.push(t);
    }
    while(!q.empty()) {
        t = q.top();
        q.pop();
        if(t.op == 'G') {
            for(int i = 1 ; i <= n; i++) {
                if(a[i] == t.id) {
                    a[i] = 0;
                    break; 
                }
            }
        } else {
            for(int i = 1 ; i <= n; i++) {
                if(a[i] == 0) {
                    a[i] = t.id;
                    break;
                }
            }
        }
    }
    for(int i=1; i<=n; i++) {
        if(i!=1)
            cout<<" ";
        cout<<a[i];
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐