• PAT 2020五一线上测试赛 7-3 垃圾分类 (20分)


    7-3 垃圾分类 (20分)
     

    ljfl.jpg

    据香港《南华早报》2019年7月15日文章,上海严格的垃圾分类新规令不少居民抓狂。这催生出大量帮助找出正确分类答案的App和小程序。目前仅微信上就至少有280种与垃圾处理有关的App,在苹果应用商店也达130种。支付宝表示,已有60多家独立App开发商申请为该平台提供类似服务。

    本题就请你现场实现一个简单的垃圾分类小助手。

    输入格式:

    输入首先给出官方分类指南中每种物品的归属。在一行中给出一个正整数 N(≤),即物品数量;随后 N 行,每行给出一个物品名称(长度不超过 10 的、由小写英文字母和下划线组成的字符串)和该物品所属的分类(1 代表干垃圾、2 代表湿垃圾、3 代表可回收物、4 代表有害垃圾)。题目保证所有物品名称无重复。

    随后每行给出一个查询物品的名称(格式与指南物品名称相同)。最后一行给出结束符 #,表示查询终止,这一行不需要查询。

    输出格式:

    对每个查询的物品,在一行中给出其所属分类:Gan laji 代表干垃圾;Shi laji 代表湿垃圾;Ke Hui Shou 代表可回收物;You Hai laji 代表有害垃圾。如果查询的物品不在指南中,则输出 ? 表示不知道。

    输入样例:

    4
    bao_zhi 3
    dian_chi 4
    dan_ke 2
    bei_ke 1
    dan_ke
    dian_chi
    ren_zha
    bao_zhi
    bei_ke
    #
    
     

    输出样例:

    Shi laji
    You Hai laji
    ?
    Ke Hui Shou
    Gan laji

    题解:

    不会写,map一直超时,看了网上的https://blog.csdn.net/HdUIprince/article/details/105881803,用unordered_map可以过。可我的DEV居然还编译通不过。不过,map是可以过的。

    map的AC代码:

    #include<stdio.h>//Author:Summer
    #include<string.h>
    #include<map>
    #include<iostream>
    using namespace std;
    char laji[5][20]={"?","Gan laji","Shi laji","Ke Hui Shou","You Hai laji"};
    char str[20];
    map<string,int>lib;
    int main()
    {
        int n,num;
        scanf("%d ",&n);
        for(int i=0;i<n;++i)
        {
            scanf("%s %d ",str,&num);
            lib[str]=num;
        }
        while(scanf("%s",str)!=EOF && strcmp("#",str)!=0)
            puts(laji[lib[str]]);
        return 0;
    }

    map和unorder_map的区别详见:https://blog.csdn.net/qq_21997625/article/details/84672775

    需要引入的头文件不同
    map: #include < map >
    unordered_map: #include < unordered_map >

    内部实现机理不同
    map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。
    unordered_map: unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。哈希表详细介绍

    优缺点以及适用处
    map:

    优点:

    有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作
    红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高
    缺点: 空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间

    适用处:对于那些有顺序要求的问题,用map会更高效一些

    unordered_map:

    优点: 因为内部实现了哈希表,因此其查找速度非常的快
    缺点: 哈希表的建立比较耗费时间
    适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map
    总结:

    内存占有率的问题就转化成红黑树 VS hash表 , 还是unorder_map占用的内存要高。
    但是unordered_map执行效率要比map高很多
    对于unordered_map或unordered_set容器,其遍历顺序与创建该容器时输入的顺序不一定相同,因为遍历是按照哈希表从前往后依次遍历的
    map和unordered_map的使用
    unordered_map的用法和map是一样的,提供了 insert,size,count等操作,并且里面的元素也是以pair类型来存贮的。其底层实现是完全不同的,上方已经解释了,但是就外部使用来说却是一致的。

    unordered_map的AC代码:

    #include <iostream>
    #include <unordered_map>
    using namespace std;
    string m[10] = {"","""Gan laji", "Shi laji", "Ke Hui Shou", "You Hai laji"};
    unordered_map<string, int> a;
    int n;
    int main()
    {
        scanf("%d", &n);
        char s[15];
        for(int i = 0; i < n; i++)
        {
            int t;
            scanf("%s%d", &s, &t);
            string str(s);
            a[str] = t;
        }    
        while(scanf("%s", &s))
        {
            string name(s);
            if(name == "#") break;
            if(a.count(name)) printf("%s
    ", m[a[name]].c_str());
            else printf("?
    ");
        }
        return 0;
    }
  • 相关阅读:
    传感器仿真平台——数据生成模块(三)
    写一个ES6 的遍历目录函数
    编码风格
    关于DOM事件的一个例子
    WEB DB
    表格资料
    css3 鼠标移入移出效果
    css 3D
    正向代理和反向代理
    FileReader 对象
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13270522.html
Copyright © 2020-2023  润新知