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\n", m[a[name]].c_str());
        else printf("?\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/caiyishuai/p/12814775.html