原题链接:CCF-CSP 202203-3 计算资源调度器
代码贴出来自己都不好意思,全TM复制粘贴
代码的结构大致是这样:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1010;
struct Node
{
int id;//编号
int tasksum;//任务数
int area;//可用区
map<int,int> mp;//任务-应用
friend bool operator < (const Node& a,const Node& b )
{
if(a.tasksum!=b.tasksum) return a.tasksum>b.tasksum;
else return a.id>b.id;
}
};
vector<int> Area[N];//每个可用区上的节点编号
int num=0;//任务数
priority_queue<Node> pq;
map<int,set<int>> apply;//每个应用对应的可用区
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n,m;
cin>>n>>m;
//输入计算节点
for(int i=1;i<=n;i++)
{
int li; cin>>li;
Node x;
x.area=li;
x.id=i;
x.tasksum=0;
pq.push(x);
Area[li].push_back(i);
}
int g; cin>>g;
while(g--)
{
int f,a,na,pa,paa,paar;
cin>>f>>a>>na>>pa>>paa>>paar;
int pre=num;
if(paa==0)//没有计算任务反亲和性要求
{
if(na)//计算任务必须在指定可用区na上运行
{
if(Area[na].size()==0) //编号为na的可用区上没有结点
{
for(int j=0;j<f;j++) cout<<0<<" ";
cout<<endl;
continue;
}
else if(Area[na].size()>0 && pa==0)
{
priority_queue<Node> tmp;
int cnt=0;
while(cnt<f)
{
Node x=pq.top();
pq.pop();
if(x.area==na)
{
x.tasksum++;
num++;
x.mp[num]=a;
apply[a].insert(x.area);
cout<<x.id<<" ";
cnt++;
pq.push(x);
}
else tmp.push(x);
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
}
else if(Area[na].size()>0 && pa>0)//必须和必须和编号为pa的应用的计算任务在同一个可用区运行;
{
priority_queue<Node> tmp;
int cnt=0;
if(apply[pa].size()==0)
{
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
cout<<endl;
continue;
}
while(!pq.empty() && cnt<f)
{
Node x=pq.top();
pq.pop();
if(apply[pa].count(x.area))
{
if(x.area==na)
{
cout<<x.id<<" ";
apply[a].insert(x.area);
x.tasksum++;
num++;
x.mp[num]=a;
cnt++;
pq.push(x);
}
else tmp.push(x);
}
else tmp.push(x);
}
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
}
}
else if(na==0 &&pa==0)//没有计算节点亲和性要求
{
priority_queue<Node> tmp;
int cnt=0;
while(cnt<f)
{
Node x=pq.top();
x.tasksum++;
num++;
x.mp[num]=a;
apply[a].insert(x.area);
cout<<x.id<<" ";
cnt++;
pq.pop();
pq.push(x);
}
}
else if(na==0 &&pa>0)//必须和必须和编号为pa的应用的计算任务在同一个可用区运行;
{
priority_queue<Node> tmp;
int cnt=0;
if(apply[pa].size()==0)
{
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
cout<<endl;
continue;
}
while(!pq.empty() && cnt<f)
{
Node x=pq.top();
pq.pop();
if(apply[pa].count(x.area))
{
cout<<x.id<<" ";
apply[a].insert(x.area);
x.tasksum++;
num++;
x.mp[num]=a;
cnt++;
pq.push(x);
}
else tmp.push(x);
}
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
}
}
else //不能和编号为paa的应用的计算任务在同一个计算节点上运行
{
if(na)
{
if(Area[na].size()==0) //编号为na的可用区上没有节点
{
for(int j=0;j<f;j++) cout<<0<<" ";
cout<<endl;
continue;
}
else if(Area[na].size()>0 && paar==1 && pa==0)//必须满足
{
priority_queue<Node> tmp;
int cnt=0;
while(!pq.empty() && cnt<f)
{
int flag=0;
Node x=pq.top();
pq.pop();
if(x.area==na)
{
for(auto tt:x.mp)
{
if(tt.second==paa)
{
flag=1; break;//如果该节点有编号为paa的应用的计算任务
}
}
if(flag==0)
{
cout<<x.id<<" ";
apply[a].insert(x.area);
x.tasksum++;
num++;
x.mp[num]=a;
cnt++;
pq.push(x);
}
else tmp.push(x);
}
else tmp.push(x);
}
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
}
else if(Area[na].size()>0 && paar==0 && pa==0)//尽量满足
{
priority_queue<Node> tmp;
priority_queue<Node> tmp2;
int cnt=0;
while(!pq.empty() && cnt<f)
{
int flag=0;
Node x=pq.top();
pq.pop();
if(x.area==na)
{
for(auto tt:x.mp)
{
if(tt.second==paa)
{
flag=1; break;
}
}
if(flag==0)
{
cout<<x.id<<" ";
apply[a].insert(x.area);
x.tasksum++;
num++;
x.mp[num]=a;
cnt++;
pq.push(x);
}
else tmp2.push(x);
}
else tmp.push(x);
}
while(!tmp2.empty() && cnt<f)
{
Node x=tmp2.top();
tmp2.pop();
apply[a].insert(x.area);
cout<<x.id<<" ";
x.tasksum++;
num++;
x.mp[num]=a;
cnt++;
tmp2.push(x);
}
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
while(!tmp2.empty())
{
Node y=tmp2.top();
pq.push(y);
tmp2.pop();
}
}
else if(Area[na].size()>0 && paar==1 && pa>0)//有计算任务亲和性要求,必须和编号为pa的应用的计算任务在同一个可用区运行;
{
priority_queue<Node> tmp;
int cnt=0;
if(apply[pa].size()==0)
{
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
cout<<endl;
continue;
}
while(!pq.empty() && cnt<f)
{
int flag=0;
Node x=pq.top();
pq.pop();
if(apply[pa].count(x.area))
{
if(x.area==na)
{
for(auto tt:x.mp)
{
if(tt.second==paa)
{
flag=1; break;
}
}
if(flag==0)
{
cout<<x.id<<" ";
apply[a].insert(x.area);
x.tasksum++;
num++;
x.mp[num]=a;
cnt++;
pq.push(x);
}
else tmp.push(x);
}
else tmp.push(x);
}
else tmp.push(x);
}
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
}
else if(Area[na].size()>0 && paar==0 && pa>0)//尽量满足
{
priority_queue<Node> tmp;
priority_queue<Node> tmp2;
int cnt=0;
if(apply[pa].size()==0)
{
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
cout<<endl;
continue;
}
while(!pq.empty() && cnt<f)
{
int flag=0;
Node x=pq.top();
pq.pop();
if(apply[pa].count(x.area))
{
if(x.area==na)
{
for(auto tt:x.mp)
{
if(tt.second==paa)
{
flag=1; break;
}
}
if(flag==0)
{
cout<<x.id<<" ";
apply[a].insert(x.area);
x.tasksum++;
num++;
x.mp[num]=a;
cnt++;
pq.push(x);
}
else tmp2.push(x);
}
else tmp.push(x);
}
else tmp.push(x);
}
while(!tmp2.empty() && cnt<f)
{
Node x=tmp2.top();
tmp2.pop();
cout<<x.id<<" ";
apply[a].insert(x.area);
x.tasksum++;
num++;
x.mp[num]=a;
cnt++;
tmp2.push(x);
}
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
while(!tmp2.empty())
{
Node y=tmp2.top();
pq.push(y);
tmp2.pop();
}
}
}
if(na==0 && paar==1 && pa==0)//没有计算节点亲和性要求 必须满足
{
priority_queue<Node> tmp;
int cnt=0;
while(!pq.empty() && cnt<f)
{
int flag=0;
Node x=pq.top();
pq.pop();
for(auto tt:x.mp)
{
if(tt.second==paa)
{
flag=1; break;
}
}
if(flag==0)
{
x.tasksum++;
num++;
apply[a].insert(x.area);
x.mp[num]=a;
cout<<x.id<<" ";
cnt++;
pq.push(x);
}
else tmp.push(x);
}
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
}
else if(na==0 && paar==0 && pa==0)//尽量满足
{
priority_queue<Node> tmp;
int cnt=0;
while(!pq.empty() && cnt<f)
{
int flag=0;
Node x=pq.top();
pq.pop();
for(auto tt:x.mp)
{
if(tt.second==paa)
{
flag=1; break;
}
}
if(flag==0)
{
x.tasksum++;
num++;
apply[a].insert(x.area);
x.mp[num]=a;
cout<<x.id<<" ";
cnt++;
pq.push(x);
}
else tmp.push(x);
}
while(!tmp.empty() && cnt<f)
{
Node x=tmp.top();
tmp.pop();
cout<<x.id<<" ";
apply[a].insert(x.area);
x.tasksum++;
num++;
x.mp[num]=a;
cnt++;
tmp.push(x);
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
}
else if(na==0 && paar==1 && pa>0)//有计算任务亲和性要求,必须和必须和编号为pa的应用的计算任务在同一个可用区运行;
{
priority_queue<Node> tmp;
int cnt=0;
if(apply[pa].size()==0)
{
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
cout<<endl;
continue;
}
while(!pq.empty() && cnt<f)
{
int flag=0;
Node x=pq.top();
pq.pop();
if(apply[pa].count(x.area))
{
for(auto tt:x.mp)
{
if(tt.second==paa)
{
flag=1; break;
}
}
if(flag==0)
{
x.tasksum++;
num++;
apply[a].insert(x.area);
x.mp[num]=a;
cout<<x.id<<" ";
cnt++;
pq.push(x);
}
else tmp.push(x);
}
else tmp.push(x);
}
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
}
else if(na==0 && paar==0 && pa>0)//尽量满足
{
priority_queue<Node> tmp;
priority_queue<Node> tmp2;
int cnt=0;
if(apply[pa].size()==0)
{
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
cout<<endl;
continue;
}
while(!pq.empty() && cnt<f)
{
int flag=0;
Node x=pq.top();
pq.pop();
if(apply[pa].count(x.area))
{
for(auto tt:x.mp)
{
if(tt.second==paa)
{
flag=1; break;
}
}
if(flag==0)
{
x.tasksum++;
num++;
apply[a].insert(x.area);
x.mp[num]=a;
cout<<x.id<<" ";
cnt++;
pq.push(x);
}
else tmp2.push(x);
}
else tmp.push(x);
}
while(!tmp2.empty() && cnt<f)
{
Node x=tmp2.top();
tmp2.pop();
cout<<x.id<<" ";
apply[a].insert(x.area);
x.tasksum++;
num++;
x.mp[num]=a;
cnt++;
tmp2.push(x);
}
while(cnt<f)
{
cout<<0<<" ";
cnt++;
}
while(!tmp.empty())
{
Node y=tmp.top();
pq.push(y);
tmp.pop();
}
while(!tmp2.empty())
{
Node y=tmp2.top();
pq.push(y);
tmp2.pop();
}
}
}
cout<<endl;
}
return 0;
}