既约分数蓝桥杯c语言,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

using namespace std;

typedef pair PII;

const int N = 2e5 + 10;

priority_queue ,greater > 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值