PAT-B 1039. 到底买不买

题目内容:

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

为方便起见,我们用[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

思路分析:

利用数组映射,记录每种珠子的数量,数组下标代表字符ASCII码。使用商家的珠子,逐项减去需要的珠子,如果出现负值,说明商家珠子不足,记录所有负值的和并输出。反之用商家总珠子数量,减去自己的总的珠子数量,并输出。

代码:

#include <stdio.h>

int main()
{
    char tmp, sale[127] = {0}, me[127] = {0};
    int in_len = 0, ch_len = 0, lack = 0;

    while ((tmp = getchar()) != '\n')
        sale[tmp]++, in_len++; // 记录商家每种珠子数量,以及总数量
    while ((tmp = getchar()) != '\n')
        me[tmp]++, ch_len++; // 记录自己每种珠子数量,以及总数量
    for (int i = 0; i < 128; i++)
        if (me[i] - sale[i] > 0) // 查找负值,并做和
            lack += me[i] - sale[i];

    if (lack == 0) // 如果总负值为0,说明商家珠子充足
        printf("Yes %d", in_len - ch_len);
    else
        printf("No %d", lack);

    return 0;
}

点这里进入试题网页

你可能感兴趣的:(pat,乙级,简洁代码)