1 条题解
-
0
本题主要围绕对进程队列的管理及按特定规则输出被移除进程成本展开,解题思路如下:
数据结构选择
- 用
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
- 上传者