PAT 线上模拟赛(20200501)7-3 垃圾分类

这篇博客介绍了一道编程题目,要求实现一个简单的垃圾分类助手。题目中给出了输入输出格式,以及处理方法,建议使用字符串数组和哈希函数进行编码以避免超时。参考代码提供了实现思路。
摘要由CSDN通过智能技术生成

ljfl.jpg

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

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

输入格式:

输入首先给出官方分类指南中每种物品的归属。在一行中给出一个正整数 N(≤10​5​​),即物品数量;随后 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值