2022年9月27日花了一个半小时写了95分,记录一下,存模拟,没用什么算法
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<algorithm>
#define N 2010
using namespace std;
int n,m; //计算节点数目和可用区数目,编号
int g;//计算任务组数,要为其分配计算节点
struct node{
//计算节点结构体
int L;//位于可用区的编号
int cnt;//运行计算任务的数量
}nodes[N];
struct yingyong{
int cnt;//任务数量
int jisuan[N];//每个任务被分配的计算节点编号
};
map<int,yingyong>yy; //应用编号-应用结构体
bool cmp(int n1,int n2){
if(nodes[n1].cnt!=nodes[n2].cnt){
return nodes[n1].cnt<nodes[n2].cnt;
}
else{
return n1<n2;
}
}
int getSort(vector<int>v){
vector<int>t=v;
if(t.size()==0) return 0;
sort(t.begin(),t.end(),cmp);
return t[0];
}
int getRes(int a,int na,int pa,int paa,int paar){
//1.过滤阶段
int p1[N];//不考虑反亲和性
for(int i=1;i<=n;i++) p1[i]=1;
if(na){
//计算节点亲和性
for(int i=1;i<=n;i++){
if(nodes[i].L!=na){
p1[i]=0;
}
}
}
if(pa){
//计算任务亲和性
for(int i=1;i<=n;i++){
if(p1[i]==0) continue;
bool flag=false;
for(int j=1;j<=yy[pa].cnt;j++){
if(nodes[i].L==nodes[yy[pa].jisuan[j]].L){
flag=true;
break;
}
}
if(flag==false){
p1[i]=0;
}
}
}
int p2[N]; //考虑反亲和性
for(int i=1;i<=n;i++) p2[i]=p1[i];
if(paa){
for(int i=1;i<=n;i++){
if(p2[i]==0) continue;
bool flag=true;
for(int j=1;j<=yy[paa].cnt;j++){
if(i==yy[paa].jisuan[j]){
flag=false;
break;
}
}
if(flag==false){
p2[i]=0;
}
}
}
vector<int>v1;
vector<int>v2;
for(int i=1;i<=n;i++){
if(p1[i]==1) v1.push_back(i);
if(p2[i]==1) v2.push_back(i);
}
//2.排序阶段
if(v2.size()!=0){
return getSort(v2);
}
else{
//必须满足
if(paar==1) return 0;
else{
return getSort(v1);
}
}
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>nodes[i].L;
cin>>g;
for(int i=0;i<g;i++){
int f,a,na,pa,paa,paar;
//a-所属应用编号
//na-要运行在编号为na的可用区上
//pa-要与编号为pa的应用的计算任务的可用区上运行
//paa-不能与编号为paa的应用的计算任务在同一计算节点上运行
cin>>f>>a>>na>>pa>>paa>>paar;
for(int j=0;j<f;j++){
int res=getRes(a,na,pa,paa,paar);
if(res==0) cout<<"0"<<" ";
else{
nodes[res].cnt+=1;
yy[a].cnt+=1;
yy[a].jisuan[yy[a].cnt]=res;
cout<<res<<" ";
}
}
cout<<endl;
}
return 0;
}