第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;
}
posted @ 2025-12-03 10:30  quanjun  阅读(5)  评论(0)    收藏  举报