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]; } }
标签:node,201709,return,int,钥匙,time,CCF,id,op 来源: https://www.cnblogs.com/LikeFish/p/16216489.html