-
首先这道题开头的信息有点让人不知所措,各种依赖关系是十分复杂的,开始可能会不知道如何进行数据的存储,但是读题之后会发现这道题要成功解决所要掌握的两个重要信息:
-
启动一组(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>
里必须给后面的结构体写一个无参构造函数,不然会报编译错误。 -
在进行
sort
的cmp
函数时,加上引用会快很多,也是这道题卡常的点。也可以不用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;
}
欢迎大家留言进行讨论!