1 条题解

  • 0
    @ 2025-8-24 22:08:52

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 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
    上传者