ccf-csp202203-3资源调度管理器

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值