Attention:
①vector的遍历方式
void text()
{
vector<int> v1 = {0,1,2,3,4,5,6};
for(auto ite = v1.begin(); ite != v1.end(); ite++)
{
cout << *ite <<" ";
}
}
②厘清题意,代码中的avaiZone、v[MAX]无用。
#include<bits/stdc++.h>
using namespace std;
#define MAX 100000
map<int, vector<int>>avaiZone;//可用区 -> 计算节点
map<int, vector<int>>calPoint;//计算节点 -> 计算任务
map<int, int>PointZone;//计算节点 -> 可用区
map<int, map<int, int>>avaiApp;//判断某可用区中是否有某应用
map<int, map<int, int>>pointApp;//判断某节点中是否有某应用
vector<int>candi1, candi2;//过滤阶段的候选节点
int n, m, g, k, v[MAX];
int f, a, na, pa, paa, paar;
//计算节点亲和性要求
bool satif_na(int na, int point)
{
//没有计算节点亲和性要求
if (na == 0)return true;
//计算节点point在na可用区内
if (PointZone[point] == na)return true;
return false;
}
//计算任务亲和性要求
bool satif_pa(int pa, int point)
{
//没有计算任务亲和性要求
if (pa == 0)return true;
//计算节点point和应用pa在同一个可用区
if (avaiApp[PointZone[point]][pa])return true;
return false;
}
//计算任务反亲和性要求
bool satif_paa(int paa, int point)
{
//没有计算任务反亲和性要求
if (paa == 0)return true;
//没有和编号为paa应用的计算任务运行在一个计算节点
if (!pointApp[point][paa])return true;
return false;
}
//排序阶段,在candinum中选择合适节点
void get_ans(int num, int a)
{
int res = 0;
if (num == 1)
{
for (auto ite = candi1.begin(); ite != candi1.end(); ite++)
{
if (res == 0)res = *ite;
if (calPoint[res].size() > calPoint[*ite].size())res = *ite;
if (calPoint[res].size() == calPoint[*ite].size() && res > *ite)res = *ite;
}
}
else if (num == 2)
{
for (auto ite = candi2.begin(); ite != candi2.end(); ite++)
{
if (res == 0)res = *ite;
if (calPoint[res].size() > calPoint[*ite].size())res = *ite;
if (calPoint[res].size() == calPoint[*ite].size() && res > *ite)res = *ite;
}
}
calPoint[res].push_back(a);//计算节点中加入一个应用a的计算任务
avaiApp[PointZone[res]][a] = 1;
pointApp[res][a] = 1;
cout << res << ' ';
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i)
{
cin >> k;
avaiZone[k].push_back(i);
PointZone[i] = k;
}
cin >> g;
for (int i = 1; i <= g; ++i)
{
cin >> f >> a >> na >> pa >> paa >> paar;
memset(v, 0, sizeof(v));
for (int j = 1; j <= f; ++j)//第i组计算任务中的任务j
{
candi1.clear(); candi2.clear();
//如果要求的可用区没有节点,为空
if (na > 0 && avaiZone[na].empty())
{
for (int ii = 1; ii <= f; ++ii)
printf("0 ");
break;
}
//过滤阶段
for (int ii = 1; ii <= n; ++ii)
{
if (satif_na(na, ii) && satif_pa(pa, ii))
{
candi2.push_back(ii);
if (satif_paa(paa, ii))
candi1.push_back(ii);
}
}
if (!candi1.empty())get_ans(1, a);
else {
if (candi1.empty() && paar == 0)get_ans(2, a);
else printf("0 ");
}
}
cout << endl;
}
return 0;
}