1 条题解

  • 0
    @ 2025-5-4 17:03:43

    本题主要围绕对进程队列的管理及按特定规则输出被移除进程成本展开,解题思路如下:

    数据结构选择

    • map<int, int> 类型的 mp 来存储进程成本及其数量。map 自动按键(进程成本)排序,方便按策略找到最小或最大成本进程 。键是进程成本,值是具有该成本的进程数量,能有效处理相同成本进程的情况。
    • set<int> 类型的 rmlist 存储移除列表中的序号。set 具有自动去重和排序功能,便于快速查找某个序号是否在移除列表中。

    输入处理

    • 读取进程的最大成本 m,此信息在本题后续核心逻辑中未直接使用,但可能是题目设定的背景参数。
    • 读取移除列表长度 n,然后依次读取 n 个序号并插入到 rmlist 中,完成移除列表的构建。

    请求处理

    • 添加进程(a x请求):读取要添加的进程成本 x,在 mp 中查找。若不存在该成本记录,将其插入并设置数量为 1;若已存在,将对应数量加 1,实现进程加入队列操作。
    • 改变策略(p i请求):读取策略值 i,将当前策略记录变量 plc 更新为 i,以便后续移除进程时依据新策略操作。
    • 移除进程(r请求)
      • 先将操作计数变量 cnt 加 1,用于记录移除操作的次序。
      • 检查 mp 的大小判断队列是否为空。若为空,输出 -1 并跳过后续移除操作,直接进入下一次请求处理。
      • 若队列非空,根据当前策略 plc 查找要移除的进程:
        • plc 为 1 时,通过 mp.begin() 获取成本最小的进程(因为 map 按键升序排序)。
        • plc 为 2 时,通过 --mp.end() 获取成本最大的进程(map 迭代器指向末尾元素的下一个,减 1 后指向末尾元素,即最大成本进程) 。
      • 检查当前操作序号 cnt 是否在移除列表 rmlist 中。若在,输出找到的进程成本。
      • 根据找到的进程数量进行处理:若数量为 1,从 mp 中删除该进程成本记录;若数量大于 1,将对应数量减 1 。

    结束处理

    当读取到请求为 e 时,表明当前数据集请求处理完毕,输出一个空行(用于分隔不同数据集结果),然后继续读取下一个数据集(若有)或结束程序。

    #include<iostream>
    #include<string>
    #include<map>
    #include<set>
    
    using namespace std;
    
    int main(){
        int m;
        while(cin>>m){
                      map<int, int> mp;
                      set<int> rmlist;
                      int n;
                      cin >> n;
                      for(int i = 0; i < n; i++){
                              int t;
                              cin >> t;
                              rmlist.insert(t);
                      }
                      string s;
                      int plc = 1,cnt = 0;
                      while(cin>>s&&s!="e"){
                                            if(s=="a"){
                                                       int t;
                                                       cin >> t;
                                                       if(mp.find(t)==mp.end())
                                                                               mp[t] = 1;
                                                       else
                                                           mp[t]++;
                                            }
                                            else if(s=="p"){
                                                 int t;
                                                 cin >> t;
                                                 plc = t;
                                            }
                                            else{
                                                 cnt++;
                                                 if(mp.size()==0){
                                                                  cout << -1 << endl;
                                                                  continue;
                                                 }
                                                 map<int,int>::iterator it;
                                                 it = plc==1?mp.begin():--mp.end();
                                                 if(rmlist.find(cnt)!=rmlist.end())
                                                                                   cout << it->first << endl;
                                                 if(it->second==1)
                                                                  mp.erase(it);
                                                 else
                                                     it->second--;
                                            }
                      }
                      cout << endl;
        }
    }
    • 1

    信息

    ID
    282
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者