据香港《南华早报》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; }