Skip to content

1383: 聪老师不想摸鱼

题目

题目描述

一天,聪老师在虚拟机里愉快玩耍的时候,一条提示信息点醒了他。

不能再这样摸下去了!聪老师暗下决心。

按照科学的方法论,聪老师决定从统计自己的摸鱼时间开始,有针对性的制止自己摸鱼。现在他需要一个统计工具,你能帮帮他吗?

聪老师想统计的数据分为两个部分。第一个部分是每项摸鱼活动每次进行的时间,摸鱼活动的名称是长度小于20,由字母、数字与下划线构成的字符串,每次进行的时间是若干个在int范围内的自然数,以分钟为单位;第二部分是摸鱼活动的相关信息,包括一个名称str(格式与第一部分一致),一个自然数avg代表平均每次摸鱼进行的时间,一个自然数level代表自己对此项摸鱼活动的喜爱程度。聪老师还希望将第二部分的活动按照顺序排列整齐,摸鱼时间长的在前,若时间相同则喜爱程度较低的在前,若喜爱程度依旧相等则活动名称字典序小的在前。注意两个部分的活动没有关联

具体地说,你应该使用如下的数据结构去维护这两部分的数据:

```c++ struct activity { // some variables here };

std::map> m; std::set s; ```

并设法使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了,可以的话,请您参考添加页面,与大家一起分享你的题解!