2021蓝桥杯C++第二届省赛
Posted Akoasm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021蓝桥杯C++第二届省赛相关的知识,希望对你有一定的参考价值。
负载平衡
题目描述
有 \\(n\\) 台计算机,第 \\(i\\) 台计算机的运算能力为 \\(v_i\\)。
有一系列的任务被指派到各个计算机上,第 \\(i\\) 个任务在 \\(a_i\\) 时刻分配,指定计算机编号为 \\(b_i\\),耗时为 \\(c_i\\) 且算力消耗为 \\(d_i\\)。
如果此任务成功分配,将立刻开始运行,期间持续占用 \\(b_i\\) 号计算机 \\(d_i\\) 的算力,持续 \\(c_i\\) 秒。
对于每次任务分配,如果计算机剩余的运算能力不足则输出 \\(-1\\),并取消这次分配,否则输出分配完这个任务后这台计算机的剩余运算能力。
数据范围
\\(1 \\leq n,m \\leq 200000,1 \\leq a_i,c_i,d_i,v_i \\leq 10^9,1 \\leq b_i \\leq n\\)
分析
对于每个时刻被选中的计算机,我们需要知道它此时的算力有多少,而此时的算力在之前可能被消耗过需要恢复,那么我们考虑对于每一个计算机维护一个小根堆,每次分配任务的时候将\\(\\leq a\\)的任务弹出,然后恢复算力,判断即可。
代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N = 2e5 + 10;
priority_queue <PII,vector <PII> ,greater <PII> > q[N];
#define mk(x,y) make_pair(x,y)
int n,m;
int v[N];
int a,b,c,d;
int main () {
ios :: sync_with_stdio(false);
cin >> n >> m;
for(int i = 1;i <= n; ++i) {
cin >> v[i];
}
while(m --) {
cin >> a >> b >> c >> d;
while(q[b].size() and q[b].top().first <= a) {
v[b] += q[b].top().second;
q[b].pop();
}
if(v[b] < d) puts("-1");
else {
q[b].push(mk(a + c,d));
v[b] -= d;
printf("%d\\n",v[b]);
}
}
return 0;
}
以上是关于2021蓝桥杯C++第二届省赛的主要内容,如果未能解决你的问题,请参考以下文章
第十二届蓝桥杯省赛第一场C++ A/B/C组 真题题解(详细讲解 + 代码分析)看这篇就够了~~~~
2021年软件类第十二届蓝桥杯 省赛 python组 A-E题解
2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解
2021年软件类第十二届蓝桥杯第二场省赛 python组 F-J题解