CCF-CSP 202203-3 计算资源调度器 100分

原题链接: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;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值