CSP-2022-03-3(计算资源调度器)

  • 首先这道题开头的信息有点让人不知所措,各种依赖关系是十分复杂的,开始可能会不知道如何进行数据的存储,但是读题之后会发现这道题要成功解决所要掌握的两个重要信息

    • 启动一组(f_i, a_i, na_i,pa_i,paa_i,paar_i)其实就是相当于启动f_i组(1, a_i, na_i,pa_i,paa_i,paar_i)。这个信息可以方便我们不需要在一次操作中考虑任务个数的变化,使代码复用性更强

    • 不要过于看重可用区域造成的计算节点的隔离,我们可以记录每个计算节点所属的可用区,然后将节点单独存到vector之中,进行操作,这样可以让我们对于计算节点的操作更加方便。

  • 一定要记住在map<int, struct>里必须给后面的结构体写一个无参构造函数,不然会报编译错误。

  • 在进行sortcmp函数时,加上引用会快很多,也是这道题卡常的点。也可以不用cmp,直接在结构体内部进行重载<号,代码如下:

struct unit {
	ll id, z;
	ll sum;
	set<ll> task;
	unit(ll d, ll Z) {
		id = d; sum = 0; z = Z;
	}
    // 无参构造函数
	unit (): id(0), z(0) {}
    // 重载<号
	bool operator < (const unit& a) const {
		if (sum != a.sum) {
			return sum < a.sum;
		} else {
			return id < a.id;
		}
	}
};

最终满分题解Code:

#include <bits/stdc++.h>
#define endl '\n'
typedef long long ll;
using namespace std;
ll n, m, g;
const ll MAXN = 1e3 + 5;
struct unit {
	ll id, z;
	ll sum;
	set<ll> task;
	unit(ll d, ll Z) {
		id = d; sum = 0; z = Z;
	}
	unit (): id(0), z(0) {}
};
struct cal {
	set<int> cals;
	unordered_map<int, unit> nodes;
};
vector<cal> zone(MAXN);
auto cmp = [](unit& a, unit& b) {
	if (a.sum != b.sum) {
		return a.sum < b.sum;
	} else {
		return a.id < b.id;
	}
};
ll deal (ll f, ll a, ll na, ll pa, ll paa, ll paar) {
	vector<unit> tmp;
	if (na == 0) {
		if (pa != 0) {
			for (ll i = 1; i <= m; ++i) {
				if (zone[i].cals.find(pa) != zone[i].cals.end()) {
					for (auto j : zone[i].nodes) {
						tmp.push_back(j.second);
					}
				}
			}
		} else {
			for (ll i = 1; i <= m; ++i) {
				for (auto j : zone[i].nodes) {
					tmp.push_back(j.second);
				}
			}
		}
	} else {
		if (pa == 0 || zone[na].cals.find(pa) != zone[na].cals.end()) {
			for (auto i : zone[na].nodes) {
				tmp.push_back(i.second);
			}
		}
	}
	if (tmp.size() == 0) return 0;
	sort(tmp.begin(), tmp.end(), cmp);
	for (auto i : tmp) {
		if (i.task.find(paa) == i.task.end()) {
			zone[i.z].nodes[i.id].sum++;
			zone[i.z].nodes[i.id].task.insert(a);
			zone[i.z].cals.insert(a);
			return i.id;
		}
	}
	if (paar == 1) return 0;
	else {
		zone[tmp[0].z].nodes[tmp[0].id].sum++;
		zone[tmp[0].z].nodes[tmp[0].id].task.insert(a);
		zone[tmp[0].z].cals.insert(a);
		return tmp[0].id;
	}
	return 0;
}
void solve() {
	cin >> n >> m;
	for (ll i = 1; i <= n; ++i) {
		ll tmp; cin >> tmp;
		unit x(i, tmp);
		zone[tmp].nodes[i] = x;
	}
	cin >> g;
	for (ll _ = 0; _ < g; _++) {
		ll f, a, na, pa, paa, paar;
		cin >> f >> a >> na >> pa >> paa >> paar;
		for (int i = 0; i < f; ++ i) {
			cout << deal(1, a, na, pa, paa, paar) << " ";
		} cout << endl;
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	solve();
	return 0;
}

欢迎大家留言进行讨论!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值