PAT乙级真题1039 || 到底买不买(详解,C/C++示例,测试点分析)

个人主页:mzwang.top

到底买不买

题目描述:

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。

为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。

figbuy.jpg

输入格式:

每个输入包含 1 个测试用例。每个测试用例分别在 2 行中先后给出摊主的珠串和小红想做的珠串,两串都不超过 1000 个珠子。

输出格式:

如果可以买,则在一行中输出 Yes 以及有多少多余的珠子;如果不可以买,则在一行中输出 No 以及缺了多少珠子。其间以 1 个空格分隔。

输入样例1:

ppRYYGrrYBR2258
YrR8RrY

输出样例1:

Yes 8

输入样例2:

ppRYYGrrYB225
YrR8RrY

输出样例2:

No 2

题目来源:PAT乙级1039
作者:CHEN, Yue
单位:浙江大学

问题解决:

解题思想

此题采用字符串散列思想就很简单了。在输入摊主的串珠和小红需要的串珠对应的字符串的同时(将字符以下标的形式存入数组),统计每个字符的个数;串珠的颜色只以大小写字母和数字来表示,它们对应的ASCII码的范围在0-128之间;判断是不足还是多余的时候,从0开始遍历整个数组,注意摊主有的而小红不需要的颜色也要统计为多余的部分,这一点可能会忽略。

代码示例(C/C++)

小提示:请将以下代码保存为.cpp格式(C++程序)左右滑动代码以查看完整代码

#include <cstdio>
using namespace std;
int main()
{
    //用串珠标记的ASCII码最为数组下标,相应内容存入该串珠的个数
    int a[128] = {0},b[128] = {0};  //a[]为摊主的串柱,b[]为小红的串珠
    char c;
    c = getchar();
    while(c != '\n'){   //统计摊主的各串珠个数
        a[c]++;
        c = getchar();
    }
    c = getchar();
    while(c != '\n'){   //统计小红需要串珠的个数
        b[c]++;
        c = getchar();
    }
    int more = 0,lack = 0;
    for(int i = 0; i < 127; i++){
        if(b[i]){   //i对应的颜色是小红想要的
            if(a[i] > b[i]){    //该颜色串珠足够
                more += a[i] - b[i];
            }
            else{   //该颜色串珠不足
                lack += b[i] - a[i];
            }
        }
        else{
            if(a[i]){   //小红不需要的颜色但摊主的串珠有,也统计为多余的
                more += a[i];
            }
        }
    }
    if(lack){   //有不足
        printf("No %d",lack);
    }
    else{   //多余
        printf("Yes %d",more);
    }
    return 0;
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值