PAT 乙级 1039 到底买不买(20)
小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。
为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。
图 1
输入格式:
每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。
输出格式:
如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。
输入样例1:
ppRYYGrrYBR2258 YrR8RrY
输出样例1:
Yes 8
输入样例2:
ppRYYGrrYB225 YrR8RrY
输出样例2:
No 2
题意很简单,一共出现62个字母,分别对应相应的数组下标存储就行
1 #include<iostream> 2 #include<string> 3 #include<cctype> 4 5 using namespace std; 6 7 void deal(char arr[],const string &str) 8 { 9 int size = str.size(); 10 11 for (int i = 0; i < size; ++i) 12 { 13 if (isdigit(str[i])) 14 ++arr[str[i] - 48]; 15 else if (isupper(str[i])) 16 ++arr[str[i] - 55]; 17 else 18 ++arr[str[i] - 61]; 19 } 20 } 21 22 int main() 23 { 24 string want; 25 string exist; 26 char arr1[62] = { 0 }, arr2[62] = { 0 }; 27 bool flag = true; 28 int num1 = 0, num2 = 0; 29 30 getline(cin, exist); 31 getline(cin, want); 32 33 deal(arr1,exist); 34 deal(arr2, want); 35 36 for (int i = 0; i < 62; ++i) 37 { 38 if (arr2[i] != 0) 39 { 40 if (arr1[i] >= arr2[i]) 41 num1 += arr1[i] - arr2[i]; 42 else 43 { 44 flag = false; 45 num2 += arr2[i] - arr1[i]; 46 } 47 } 48 else 49 num1 += arr1[i]; 50 } 51 52 if (flag) 53 cout << "Yes " << num1 << endl; 54 else 55 cout << "No " << num2 << endl; 56 57 return 0; 58 }