【CCF-CSP 202203-3】 计算资源调度器

题目链接:http://118.190.20.162/view.page?gpid=T141
~~
题目中的筛选方法也是后续的关键几步,这一步题目已经告诉我们,我们直接实现即可。

  • 小 C
    要求你按照如下方法来分配计算节点:按照计算任务的启动顺序,根据要求,依次为每个计算任务选择计算节点。一旦选择了一个计算节点,就固定下来不再变动,
    并且在此后的选择中,不再考虑这个计算任务的要求。对每个计算任务,选择计算节点的方法是:
    过滤阶段
    在这个阶段,先根据计算任务的要求,过滤出所有满足要求的计算节点。如果不存在这样的计算节点,并且指定了计算任务反亲和性要求,并且计算任务反亲和性要求是尽量满足的,那么去掉计算任务反亲和性要求,再过滤一次。**如果还不存在,就认为该计算任务的要求无法满足,该计算任务无法分配。 **
    排序阶段
    在这个阶段,将过滤后的计算节点按照这个方法排序: 选择此时运行计算任务数量最少的计算节点; 选择编号最小的计算节点。

~~

#include <bits/stdc++.h>
using namespace std;
int n,m,g;
const int maxn = 1e3 + 10;
const int g_maxn = 2e3 + 10;
int l[maxn];
int f[g_maxn],a[g_maxn], na[g_maxn], pa[g_maxn], paa[g_maxn] , paar[g_maxn];

map<pair<int,int>,int>has1;
map<pair<int,int>,int>has2;
int cnt[g_maxn];

bool cmp(int A,int B){
	if(cnt[A]==cnt[B]) return A < B;
	else{
		return cnt[A] < cnt[B];
	}
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	cin >> n >> m;
	for(int i = 1;i<=n;i++) cin >> l[i];
	cin >> g;
	for(int i = 1;i<=g;i++){
		cin >> f[i] >> a[i] >> na[i] >> pa[i] >> paa[i] >> paar[i];
	}
	int index = 0;
	for(int i = 1;i<=g;i++){	
		for(int j = 1; j <= f[i];j++){
		    vector<int>v1; // we can choose by every floor v1,v2,v3 
		    if(na[i] > 0){
		    	for(int k = 1;k<=n;k++){
		    		if(l[k]==na[i]){
		    			v1.push_back(k);
					} 
				}
			}
			else if(na[i]==0){
				for(int k = 1;k<=n;k++) v1.push_back(k);
			}
			vector<int>v2;
			if(pa[i]>0){
				for(auto it:v1){
					if(has1.count(make_pair(pa[i],l[it]))){
						v2.push_back(it);
					}
				}
			}
			else{
				for(auto it:v1) v2.push_back(it); 
			}
			vector<int>v3;
			if(paa[i]>0){
				for(auto it:v2){
					if(!has2.count(make_pair(paa[i],it))){
						v3.push_back(it);
					}
				}
			}
			else{
				for(auto it:v2) v3.push_back(it); 
			}
			vector<int>temp;
			if(v3.size()==0 && paar[i]==0) temp = v2; // if parri = 0,then back v2 
			else temp = v3;
			if(temp.size()==0){ // two filter
				cout <<0<<" ";  // 
			}
			else{
			    sort(temp.begin(),temp.end(),cmp);
				cout << temp[0] <<" "; // make small
				cnt[temp[0]]++; // accumulate every point works
				has1[make_pair(a[i],l[temp[0]])] = 1; // sigin yinyong <-> qujian 
				has2[make_pair(a[i],temp[0])] = 1;   // sigin yinyong <-> point 
			}
		}
		cout << endl;
	}
    return 0;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

savkACUNCB: IOnjn

欢迎来到我的世界

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值