个人主页:mzwang.top
到底买不买
题目描述:
小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。
为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。
输入格式:
每个输入包含 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;
}