
据香港《南华早报》2019年7月15日文章,上海严格的垃圾分类新规令不少居民抓狂。这催生出大量帮助找出正确分类答案的App和小程序。目前仅微信上就至少有280种与垃圾处理有关的App,在苹果应用商店也达130种。支付宝表示,已有60多家独立App开发商申请为该平台提供类似服务。
本题就请你现场实现一个简单的垃圾分类小助手。
输入格式:
输入首先给出官方分类指南中每种物品的归属。在一行中给出一个正整数 N(≤105),即物品数量;随后 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
思路:这道题用string似乎不行,因为并没有给出输入的个数到底是多少,容易超时。所以用字符串数组,利用hash函数将其转换成一个独有的编码(27^10<30^10=900^5<1000^5=10^15,所以编码用long long型数据表示)。然后利用map映射对垃圾与分类进行映射。
参考代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<ll,int> mp;
ll hash_al(char str[]){
ll sum=0;
for(int i=0;i<strlen(str);i++){
if(i=='_'){
sum=sum*28+27;
}else sum=sum*28+(str[i]-'a'+1);
}
return sum;
}
int main(){
int n;
scanf("%d",&n);
char temp[20];
for(int i=1;i<=n;i++){
getchar();
int cate;
scanf("%s%d",temp,&cate);
mp[hash_al(temp)]=cate;
}
while(scanf("%s",temp),strcmp(temp,"#")){
ll t=hash_al(temp);
if(mp.find(t)!=mp.end()){
int i=mp[t];
if(i==1){
printf("Gan laji\n");
}else if(i==2){
printf("Shi laji\n");
}else if(i==3){
printf("Ke Hui Shou\n");
}else{
printf("You Hai laji\n");
}
}else printf("?\n");
}
return 0;
}
P.S.:突然发现姥姥真的是性情中人,在样例中,ren_zha is not la_ji
这篇博客介绍了一道编程题目,要求实现一个简单的垃圾分类助手。题目中给出了输入输出格式,以及处理方法,建议使用字符串数组和哈希函数进行编码以避免超时。参考代码提供了实现思路。
304

被折叠的 条评论
为什么被折叠?



