1383: 聪老师不想摸鱼
题目
题目描述
一天,聪老师在虚拟机里愉快玩耍的时候,一条提示信息点醒了他。
不能再这样摸下去了!聪老师暗下决心。
按照科学的方法论,聪老师决定从统计自己的摸鱼时间开始,有针对性的制止自己摸鱼。现在他需要一个统计工具,你能帮帮他吗?
聪老师想统计的数据分为两个部分。第一个部分是每项摸鱼活动每次进行的时间,摸鱼活动的名称是长度小于20,由字母、数字与下划线构成的字符串,每次进行的时间是若干个在int
范围内的自然数,以分钟为单位;第二部分是摸鱼活动的相关信息,包括一个名称str
(格式与第一部分一致),一个自然数avg
代表平均每次摸鱼进行的时间,一个自然数level
代表自己对此项摸鱼活动的喜爱程度。聪老师还希望将第二部分的活动按照顺序排列整齐,摸鱼时间长的在前,若时间相同则喜爱程度较低的在前,若喜爱程度依旧相等则活动名称字典序小的在前。注意两个部分的活动没有关联。
具体地说,你应该使用如下的数据结构去维护这两部分的数据:
```c++ struct activity { // some variables here };
std::map
并设法使s
中的数据按照题面所示的顺序排列。(提示:我们已经知道std::set
可以让其中的元素按照大小排列,那么能否使用某种语法去定义元素的大小关系呢?你可以试试std::set
的第二个模板参数,或者考虑struct
的运算符重载。)
因为聪老师的程序设计基础十分牢固,你只需要提供一个指令交互的程序(即以某种格式输入一些内容,按照格式解析并执行之)即可。
你需要实现的指令如下:
c++
* map size // 输出一行一个整数,代表map中元素对的个数。
* map insert [name] [num] [arg1], [arg2], ..., [argn] // 向map中插入一对元素,键值为name,对应的vector初始长度为num,后面读入num个整数,为此vector的初始元素。
* map erase [name] // 在map中删除name对应的元素。
* map count [name] // 输出map中键值为name的元素对个数。
* map traverse // 按照键值的字典序依次输出map中所有元素。每个元素占据一行,用空格隔开,先输出键值,再依次输出vector中的所有元素。
* map visitVec [name] [index] // 输出一行一个整数,代表map中键值为name对应的vector下标index对应的值。
* map visit [name] // 输出一行若干个整数,用空格隔开。第一个整数为vector中元素个数,之后依次输出vector中的所有元素。
* map append [name] [element] // 向map中对应键值name的vector后面增加一个数字element。
* set size // 输出一行一个整数,代表set中元素的个数。
* set insert [avg] [level] [str] // 向set中添加一个参数为avg, level, str的元素。
* set erase [avg] [level] [str] // 从set中删除一个参数为avg, level, str的元素。
* set count [avg] [level] [str] // 输出参数为avg, level, str的元素在set中的个数。
* set traverse // 按照题面中定义的顺序输出set中所有元素,每行一个元素,以 avg level str 的格式输出。
* end // 结束程序。
在以上的任何地方,如果出现了错误(如删除不存在的元素、或加入已经存在的元素),输出一行一个字符串Error
,并忽略此次操作。注意,对空的map/set进行遍历不算错误。
本题意在让大家练习 stl 相关操作,因此你不应该使用char[]
去保存字符串。请尝试使用std::string
。
输入格式
若干行指令,每行依照上述格式。
输出格式
按照要求输出。注意出现问题时输出一行一个字符串Error
,并忽略此次操作。
样例输入
map insert ctf 3 15 34 76
map insert architecture 1 32
map traverse
map append architecture 45
map visit wine
map insert jupyter 5 132 67 8 23 25
map visitVec architecture 1
map visit jupyter
map erase ctf
map traverse
map size
set insert 35 1 html
set insert 43 3 css
set insert 67 2 javascript
set count 35 1 html
set count 43 1 html
set traverse
set erase 67 2 javascript
set size
set traverse
end
样例输出
architecture 32
ctf 15 34 76
Error
45
5 132 67 8 23 25
architecture 32 45
jupyter 132 67 8 23 25
2
1
0
67 2 javascript
43 3 css
35 1 html
2
43 3 css
35 1 html
数据范围
指令数量 $opt\leq 10,000$。
保证所有整数均在int
范围内。
保证所有输入格式合法。(例如,map insert指令后的参数个数一定与num相同。)
Oops! 本题目还没有解答!
助教老师们编题的速度,已经超过了解题的速度!
OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。
如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!