第25次CSP认证第3题 计算资源调度器 题解 模拟
题目链接:https://www.acwing.com/problem/content/4460/
需要注意的是:
输入格式中的
\(paar_i\):表示计算任务亲和性要求是必须满足还是尽量满足,……
和题目描述中不对应,\(paar_i\) 应该是判断“计算任务反亲和性要求”。
应改为:
\(paar_i\):表示计算任务反亲和性要求是必须满足还是尽量满足,……
其它就是模拟实现。
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2005;
int n, m, l[maxn], g, f[maxn], a[maxn], na[maxn], pa[maxn], paa[maxn], paar[maxn], Amax;
vector<int> id[maxn]; // id[x] 记录可用区 x 中的计算节点编号
set<pair<int, int>> st1, // st1[x][y] 表示可用区x中是否包含应用y
st2; // st2[x][y] 表示计算节点x中是否包含应用y
int cnt[maxn]; // cnt[x]表示计算节点x目前运行的任务的数量
int cal(int a, int na, int pa, int paa, int paar) {
vector<int> vec1, vec2; // vec1优先选,vec2其次选择
for (int i = 1; i <= n; i++) {
if (na && l[i] != na) // 不满足:节点亲和性要求
continue;
if (pa && !st1.count({l[i], pa})) // 不满足:亲和性要求
continue;
if (!paa || !st2.count({i, paa}))
vec1.push_back(i);
else if (paar == 0)
vec2.push_back(i);
}
int p = 0;
for (auto i : vec1)
if (p == 0 || cnt[i] < cnt[p])
p = i;
if (!p) {
for (auto i : vec2)
if (p == 0 || cnt[i] < cnt[p])
p = i;
}
if (p) { // 找到了
cnt[p]++;
st1.insert({ l[p], a });
st2.insert({ p, a });
}
return p;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> l[i];
id[ l[i] ].push_back(i);
}
cin >> g;
for (int i = 1; i <= g; i++) {
cin >> f[i] >> a[i] >> na[i] >> pa[i] >> paa[i] >> paar[i];
}
for (int i = 1; i <= g; i++) {
for (int j = 1; j <= f[i]; j++) {
cout << cal(a[i], na[i], pa[i], paa[i], paar[i]) << " ";
}
cout << "\n";
}
return 0;
}
浙公网安备 33010602011771号