1 条题解
-
0
自动搬运
来自洛谷,原作者为

yangrunze
蓝蓝的天空银河里,有只小白船搬运于
2025-08-24 22:08:52,当前版本为作者最后更新于2019-12-27 22:54:49,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
众所周知,map是个好东西
可能好多萌新们都在好奇map是个啥,那这里,我先介绍一下map(如果你懂map的基本操作,请跳过这部分)
政治老师说:研究问题要分三方面:是什么、为什么、怎么做,那咱就从这三个方面说说map的操作吧!
1.什么是map?
map是一种描述“对应关系”的存储结构,就像函数一样
如果你没学函数,你也可以把map理解成下标是任何类型的数组
for example:
map <string ,int> a; //定义map这就是定义了一个string到int对应的map,也就是说,它的“自变量”为string类型,“函数值”为int类型,对于每一个string,就有一个int类型的值与之对应
然后就可以往map里面塞东西了,注意它的“下标”是一个string
a["wyxniubi"]=1; //赋值 cout<<a["wyxniubi"]; //调用,此时输出1还是拿函数的例子:此时的"自变量x"="wyxniubi","函数值y"=1
2.为啥要用map?
这个题通过审题可以发现,每一个string的学号对应一个int的分数,这样的话,这题简直就是为map量身定制的啊
其实很多字符串题中map都能派上用场。说句题外话:当数据范围非常大时,map也可以当桶排序中的“桶”来用,效果也是棒呆了
当然,map也是有缺点的,单次操作它的时间复杂度是O(lg n),有时候会TLE
3.怎样用map?
除了刚才介绍的定义和赋值,像string一样,map也有好多好用的成员函数,这里先教大家几个简单的、实用的、这个题能用到的:
a.count(x) 判断x为下标的元素是不是在a中,是就返回1,不是就返回0 a.erase(x) 删除a中x为下标的元素 a.size() 返回a中元素的个数 a.clear() 清空a 这些成员函数都不难,如果不理解,待会看看代码就能懂了
map介绍完了,接下来就是愉快的编代码时间了。因为分4种操作,我们可以用switch语句来编写,注意一定要在最后加break,一定要在最后加break,一定要在最后加break,重要的事情说三遍,其它的就是怎么用map的那些成员函数了
Code:
#include<iostream> #include<cstring> #include<map>//要用map嘛......你懂的 using namespace std; map <string,int> a; //定义一个string(姓名)到int(分数)的map int main(){ int n; cin>>n; //n条操作 for(int i=1;i<=n;i++){ int op; //操作种类1234 string name; //学生姓名 cin>>op; //输入操作种类 if(op!=4) //如果不是操作4就输入学生名字 cin>>name; switch(op){ //开始了! case 1: //操作1:加入或修改学生 int score; //这个操作需要输入分数 cin>>score; a[name]=score; //map的对应关系,把名字和分数对应起来 cout<<"OK\n"; //根据题目要求输出OK break; //别忘了加break!!! case 2: //操作2:查询学生 if(a.count(name)) //如果找得到 cout<<a[name]<<endl; //输出对应的分数 else cout<<"Not found\n"; //否则"Not Found" break; //别忘了加break!!! case 3: //操作3:删除学生 if(a.count(name)){ //如果找得到 a.erase(name); //那就删了它 cout<<"Deleted successfully\n"; //成功删除 } else cout<<"Not found\n"; //否则"Not Found" break; //别忘了加break!!! case 4: //操作4:学生人数 cout<<a.size()<<endl; //输出元素个数就好啦 } } return 0; //这个不用解释了吧 }静待红名
- 1
信息
- ID
- 4742
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者