202203-3 计算资源调度器

题意

hh

思路

一个个枚举计算结点,check,记得排序,map套set减少时间复杂度

代码

分数:100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
int n,m,l,g,f,a,na,pa,paa,paar;
int dtq[1010];//由计算结点找到对应的区
unordered_set<int> qtd[1010];//可用区内的计算节点
map<int,unordered_set<int>> btd;//应用编号 to 计算节点
map<int,unordered_set<int>> btq; //应用编号 to 计算区
PII dtb[1010];//任务数目,结点编号



int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&l);
dtq[i]=l;
qtd[l].insert(i);
dtb[i].second = i;
}
// cout<<qtd[4].size();
scanf("%d",&g);
for(int i=1;i<=g;i++){
scanf("%d%d%d%d%d%d",&f,&a,&na,&pa,&paa,&paar);
for(int j=1;j<=f;j++){
bool ck= false;
if(paa){ //排斥
for(int k=1;k<=n;k++){
int jd = dtb[k].second;
if(na && !qtd[na].count(jd)){ //不满足结点亲和性
continue;
}
if(pa && !btq[pa].count(dtq[jd])){ //不满足任务亲和
continue;
}
if(btd[paa].count(jd)){//不满足反亲和性,即在同一节点
continue;
}
ck=true;
dtb[k].first++;
btd[a].insert(jd);
btq[a].insert(dtq[jd]);
printf("%d ",jd);
break;
}
}
if(!ck && ((paa && paar==0)|| paa==0)){ //没找到 & 可以不满足|没有
for(int k=1;k<=n;k++){
int jd = dtb[k].second;
if(na && !qtd[na].count(jd)){ //不满足结点亲和性
continue;
}
if(pa && !btq[pa].count(dtq[jd])){ //不满足任务亲和
continue;
}
ck=true;
dtb[k].first++;
btd[a].insert(jd);
btq[a].insert(dtq[jd]);
printf("%d ",jd);
break;
}
}
if(!ck) printf("0 ");

sort(dtb+1,dtb+1+n);
}
printf("\n");
}

return 0;
}

题意

思路

代码

分数:

1