PAT Basic 1039. 到底买不买

PAT Basic 1039. 到底买不买

1. 题目描述:

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

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

figbuy.jpg

图 1

2. 输入格式:

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

3. 输出格式:

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

4. 输入样例:

ppRYYGrrYBR2258
YrR8RrY
ppRYYGrrYB225
YrR8RrY

5. 输出样例:

Yes 8
No 2

6. 性能要求:

Code Size Limit
16 KB
Time Limit
150 ms
Memory Limit
64 MB

思路:

判断输入字符串和目标字符串的包含关系,统计出每个字符出现的次数即可,这里我当时定义了一个结构体Zhuzi用于记录珠串。由于统计个数要确保初值为零,在这里学到了结构体的初始化方法。

My Code:

#include <stdio.h>

typedef struct zhuzi
{
    int digits[10];
    int lower[26];
    int upper[26];
} Zhuzi;

int main(void)
{
    Zhuzi zhu1 = {{0}, {0}, {0}}; // here study the initialization of struct
    Zhuzi zhu2 = {{0}, {0}, {0}}; // also can initialize out of order
    char have[1001] = "", need[1001] = "";
    char *pchar = NULL;
    int i = 0; //, res = 0;
    //int flag = 0; // 0: can buy, 1: can't buy
    int res_positive = 0, res_negative = 0;
    
    scanf("%s%s", have, need);
    
//     printf("%s\n%s\n", have, need);
//     for(int i=0; i<26; i++)
//     {
//         printf("%d ", zhu1.lower[i]);
//     }
    
    pchar = have;
    while(*pchar)
    {
        if(*pchar >= '0' && *pchar <= '9') //digits
        {
            zhu1.digits[*pchar-'0']++;
        }
        else if(*pchar >= 'a' && *pchar <= 'z') //lower
        {
            zhu1.lower[*pchar-'a']++;
        }
        else //upper
        {
            zhu1.upper[*pchar-'A']++;
        }
        
        pchar++;
    }
    
    pchar = need;
    while(*pchar)
    {
        if(*pchar >= '0' && *pchar <= '9') //digits
        {
            zhu2.digits[*pchar-'0']++;
        }
        else if(*pchar >= 'a' && *pchar <= 'z') //lower
        {
            zhu2.lower[*pchar-'a']++;
        }
        else //upper
        {
            zhu2.upper[*pchar-'A']++;
        }
        
        pchar++;
    }
    
    for(i=0; i<10; i++)
    {
        zhu1.digits[i] -= zhu2.digits[i];
        
        if(zhu1.digits[i] >= 0)
            res_positive += zhu1.digits[i];
        else
            res_negative += zhu1.digits[i];
        //res += zhu1.digits[i];
    }
    for(i=0; i<26; i++)
    {
        zhu1.lower[i] -= zhu2.lower[i];
        zhu1.upper[i] -= zhu2.upper[i];
        
        if(zhu1.lower[i] >= 0)
            res_positive += zhu1.lower[i];
        else
            res_negative += zhu1.lower[i];
        
        if(zhu1.upper[i] >= 0)
            res_positive += zhu1.upper[i];
        else
            res_negative += zhu1.upper[i];
        
        //res += zhu1.lower[i];
        //res += zhu1.upper[i];
    }
    
    if(!res_negative)
    {
        printf("Yes %d", res_positive);
    }
    else
    {
        printf("No %d", -res_negative);
    }
    printf("\n");
    
    return 0;
}
posted @ 2023-03-20 15:12  十豆加日月  阅读(3)  评论(0编辑  收藏  举报