4.5计算资源调度器(100)

模拟题的第一步就是读懂题 一定要读懂题 读题花30分钟也没有关系

题如果读懂的话 那么实现花不了多少时间 把各个变量写到一张纸上 (很重要)

防止每次往上翻 之后一定要先理解思路 再敲代码

#include <iostream>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N=1e6+10;
int n,m;
struct abc{
    int id;//节点号
    int num;//节点个数
    pii block;//应用分区号 和 当前分区任务数 
}a[N];
int g;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        int hao;cin>>hao;
        a[i].id=i;a[i].num=0;
        a[i].block.x=hao;//存储分区号
        a[i].block.y=0;
    }
    cin>>g;
    int mintask=0;// 最小任务数 针对无任何限制的情况
    while(g--){
        // cout<<"mintask:"<<mintask<<endl;
    int f,ai,nai,pai,paai,paar;
    cin>>f>>ai>>nai>>pai>>paai>>paar;
    if(paai==0&&nai==0&&pai==0){
     int cnt=0;
     while(1){ //while 跟break搭配 很常用
       for(int i=1;i<=n;i++){
          if(a[i].num==mintask){
              cnt++;
              a[i].num++;
              a[i].block.y++;//对应 应用区节点数++
              cout<<a[i].id<<' ';
          }
          if(cnt==f) break;
       }
      if(cnt==f) break;
       mintask++;//若第一轮没退出 mintask再加 必须放在下面 break在上面
    }
}
else{
      int id=0;
      int cnt=0;
      int flag=0;
      for(int i=1;i<=n;i++){
         if(nai==a[i].block.x){
             flag=1;//判读是否有这个分区
             id=i;
             break;
         }
      }
      if(!flag){
          while(f--){//直接输出0
              cout<<0<<' ';
          }
      }
      else{
         int mintask1=a[id].block.y;//求当前分区最小任务数 针对只有分区限制的情况
          for(int i=1;i<=n;i++){
           if(nai==a[i].block.x){
            //   cout<<"i:"<<i<<"blocky:"<<a[i].block.y<<" ";
              mintask1=min(mintask1,a[i].block.y);
            }    
          }
        //   cout<<endl;
        //   cout<<"zuixiao"<<mintask1<<endl;
         while(1){
          for(int i=1;i<=n;i++){//答题流程一样 但只针对分区
              if(a[i].block.x==nai){ 
               if(a[i].num==mintask1){
                cnt++;
                a[i].num++;
                cout<<a[i].id<<' '; 
              }
            }
            if(cnt==f) break;
          }
         if(cnt==f) break;  
        //  cout<<"jfioeqhfoiw"<<endl;
         mintask1++;
      }
    }
}
     cout<<endl;
}
   
   return 0;
}

2023-5-12 再次看之前的代码 感觉好臭好长  数组能做的用STL来模拟 会简单很多 50分:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_map>
#include <map>
#include <set>
using namespace std;

const int N = 1010;
typedef pair<int, int> PII;
int n, m, k;                  // 计算节点数,分区数
map<int, set<int>> area_node; // 区_节点
map<int, int> num;            // 判断数目
int cknq(int i, int na)
{
    if (!na)
        return 1;
    if (area_node[na].count(i))
        return 1;
    else
        return 0;
}
int main()
{
    cin >> n >> m;

    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        area_node[x].insert(i);
    }
    cin >> k;
     while (k--)
    {
        int f, a, nq, tq, ntq, must;
        cin >> f >> a >> nq >> tq >> ntq >> must;
        for (int p = 0; p < f; p++)
        {
            int flag = 0;
            int h=-1,min_h=1e5;//序号 对应的数目
            for (int i = 1; i <= n; i++)
            {
                if (cknq(i, nq))
                {
                    if(num[i]<min_h){
                        min_h=num[i];
                        h=i;
                    }
                }
            }
            if(h!=-1){
                cout<<h<<' ';
                num[h]++;
            }
            else cout << 0 << ' ';
         }
        cout << endl;
    }

    return 0;
}

100分代码:找到正确的逻辑流程才可 没有逻辑流程就是瞎写

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_map>
#include <unordered_map>
#include <set>
using namespace std;
const int N = 1010;
typedef pair<int, int> pii;
int n, m, k;                  // 计算节点数,分区数
unordered_map<int, set<int>> area_node; // 区_节点
unordered_map<int, int> node_num;       // 判断数目
unordered_map<int, set<int>> app_node;  // 应用——节点
int node_area[N];      // 节点_区
int cknq(int i, int nq)       // 节点 区
{
    if (!nq)
        return 1;
    if (area_node[nq].count(i))
        return 1;
    else
        return 0;
}
int cktq(int i, int tq) // 节点 应用号  在同一个可用区
{
    // 应用号——可用区——包含这一节点
    // 应用-节点-区
    if (!tq)
        return 1;
    for (auto x : app_node[tq])
    {
        if (node_area[x] == node_area[i])//在其中一个可用区即可
            return 1;
    }
    return 0;
}

int ckntq(int i, int ntq) // 节点 应用号 不在同一个节点
{
    if(!ntq) return 1;
    for(auto x:app_node[ntq]){
       if(i==x) return 0;
    }
    return 1;
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        area_node[x].insert(i);
        node_area[i] = x;
    }
    cin >> k;
    while (k--)
    {
        int f, a, nq, tq, ntq, must;
        cin >> f >> a >> nq >> tq >> ntq >> must;
        for (int p = 0; p < f; p++)
        {
            vector<int> res, t;
            for (int i = 1; i <= n; i++)
            {
                if (cknq(i, nq) && cktq(i, tq) && ckntq(i, ntq))
                    res.push_back(i);
                if (!must && cknq(i, nq) && cktq(i, tq))
                    t.push_back(i);
            }
            if (!must && !res.size())
                res = t;
            if (!res.size())
                cout << 0 << ' ';
            else
            {
                // 节点_任务数目 编号
                vector<pii> r;
                for (auto x : res)
                    r.push_back({node_num[x], x});
                sort(r.begin(), r.end());
                cout << r[0].second << ' ';
                node_num[r[0].second]++;
                app_node[a].insert(r[0].second);
            }
        }
        cout << endl;
    }

    return 0;
}

性进行判断 关键在于找到模拟的流程

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值