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