标签:node 201709 return int 钥匙 time CCF id op
这道题开始是没思路的,看了一下题解。说是把时间抽象成时间点(主要思想)。
让计算机计算的是某个时刻发生的事情,不需要管一段时间发生了什么。这样也不好思考
自己写了,没过。感觉写的太乱。于是还是在网上找了一篇,说到了优先队列
关键点:优先队列 模拟
优先队列的英文: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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。