202203-3 计算资源调度器 (100分)

//202203-3	计算资源调度器     

//一个计算节点可以进行多个计算任务

struct Node
{
	int i,na,cnt;//顶点编号,所属计算区域,计算任务数量
	set<int> app;//存储计算任务所属的应用编号
};

bool cmp(Node a,Node b) 
{
	if(a.cnt==b.cnt) return a.i<b.i;//节点按编号排序
	else return a.cnt<b.cnt;
}


vector<Node> v;
unordered_map<int,set<int>> M;//把区域的编号和应用编号联系起来
unordered_map<int,vector<Node>> qv;//把区域编号和节点存储联系

int n,m,g;
int f,ai,na,pa,paa,paar;
int t;


void update(int a,int q,int ap)
{
	M[v[a].na].insert(ap);
	v[a].cnt++;
	v[a].app.insert(ap);

};


int main()
{

	
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) 
	{
		scanf("%d",&t);
		Node temp={i,t};
		qv[t].push_back(temp);//区域加入节点
		v.push_back(temp);
	}
	
	
	sort(v.begin(),v.end(),cmp);//节点排序编号和任务数目
	
	
	scanf("%d",&g);
	while(g--)
	{
		scanf("%d%d%d%d%d%d",&f,&ai,&na,&pa,&paa,&paar);
		while(f--)
		{
			bool panduan=0;
			if(na)//判断是否有区间编号要求
			{
				if(pa)//判断是否要和编号为pa编号应用的任务在同一可行区域执行
				{
					if(paa)//判断是否不能和编号为paa应用的计算任务在同一节点上执行,且必须满足
					{
						if(qv[na].empty()||!M[na].count(pa))
						{
							printf("0 ");
							continue;
						}
						
						int tt=n,min=999999,idex=0;
						for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
						{
							if(v[i].na!=na) continue;
							if(v[i].app.count(paa)) continue;
							if(v[i].cnt==min) 
							{
								if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							} 
							else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							
						}
						if(panduan)
						{
							printf("%d ",tt);
							update(idex,na,ai);
							continue;
						}
						if(!panduan&&paar==0) goto index;
						else if(!panduan) printf("0 ");
					}
					else//尽量满足
					{
						
					index:
						if(qv[na].empty()||!M[na].count(pa))
						{
							printf("0 ");
							continue;
						}
						
						int tt=n,min=999999,idex=0;
						for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
						{
							if(v[i].na!=na) continue;
							if(v[i].cnt==min) 
							{
								if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							} 
							else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							
						}
						if(panduan)
						{
							printf("%d ",tt);
							update(idex,na,ai);
							continue;
						}
					}
				}
				else
				{
					if(paa)//判断是否不能和编号为paa应用的计算任务在同一节点上执行,且必须满足
					{
						if(qv[na].empty())
						{
							printf("0 ");
							continue;
						}
						
						int tt=n,min=999999,idex=0;
						for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
						{
							if(v[i].na!=na) continue;
							if(v[i].app.count(paa)) continue;
							if(v[i].cnt==min) 
							{
								if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							} 
							else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							
						}
						if(panduan)
						{
							printf("%d ",tt);
							update(idex,na,ai);
							continue;
						}
						if(!panduan&&paar==0) goto index1;
						else if(!panduan)printf("0 ");
					}
					else//尽量满足
					{
					index1:
						if(qv[na].empty())
						{
							printf("0 ");
							continue;
						}
						
						int tt=n,min=999999,idex=0;
						for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
						{
							if(v[i].na!=na) continue;
							if(v[i].cnt==min) 
							{
								if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							} 
							else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							
						}
						if(panduan)
						{
							printf("%d ",tt);
							update(idex,na,ai);
							continue;
						}
					}
				}
			}
			else//没有区间编号要求
			{
				if(pa)//判断是否要和编号为pa编号应用的任务在同一可行区域执行
				{
					if(paa)//判断是否不能和编号为paa应用的计算任务在同一节点上执行,且必须满足
					{
						
						int tt=n,min=999999,idex=0;
						for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
						{
							if(!M[v[i].na].count(pa)) continue;
							if(v[i].app.count(paa)) continue;
							if(v[i].cnt==min) 
							{
								if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							} 
							else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							
						}
						if(panduan)
						{
							printf("%d ",tt);
							update(idex,na,ai);
							continue;
						}
						if(!panduan&&paar==0) goto index2;
						else if(!panduan) printf("0 ");
					}
					else//尽量满足
					{
					index2:
						int tt=n,min=999999,idex=0;
						for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
						{
							if(!M[v[i].na].count(pa)) continue;
							if(v[i].cnt==min) 
							{
								if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							} 
							else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							
						}
						if(panduan)
						{
							printf("%d ",tt);
							update(idex,na,ai);
							continue;
						}
						if(!panduan) printf("0 ");
					}
				}
				else
				{
					if(paa)//判断是否不能和编号为paa应用的计算任务在同一节点上执行,且必须满足
					{	
						int tt=n,min=999999,idex=0;
						for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
						{
							if(v[i].app.count(paa)) continue;
							if(v[i].cnt==min) 
							{
								if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							} 
							else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							
						}
						if(panduan)
						{
							printf("%d ",tt);
							update(idex,na,ai);
							continue;
						}
						
						if(!panduan&&paar==0) goto index3;
						else if(!panduan)printf("0 ");
					}
					else//尽量满足
					{
					index3:
						int tt=n,min=999999,idex=0;
						for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
						{
							if(v[i].cnt==min) 
							{
								if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							} 
							else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
							
						}
						if(panduan)
						{
							printf("%d ",tt);
							update(idex,na,ai);
							continue;
						}
					}
				}	
			}
		}
		printf("\n");
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值