既约分数蓝桥杯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;
}
總結
以上是生活随笔為你收集整理的既约分数蓝桥杯c语言,2021蓝桥杯C++第二届省赛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML的块级元素和行级元素的标签列表
- 下一篇: php里isset的属性,测试PHP中变