为方便起见,我们用[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
先贴上我写的代码
#include<iostream> #include<string> using namespace std; int cntnum[10]; int a[26]; int A[26]; int cntnum1[10]; int a1[26]; int A1[26]; int surplus; int need; int main(){ string s; //售卖的 string b; //购买的 cin>>s; cin>>b; for(int i=0;i<s.length();i++){ if (s[i] >= 'a' && s[i] <= 'z') // 统计某个小写字母出现的次数 { a[s[i]-'a']++;//小写检测 } else if(s[i] >= 'A' && s[i] <= 'Z') // 统计某大写字母出现的次数 { A[s[i]-'A']++;//大写检测 }else{ for(int j=0;j<=9;j++){ if(s[i]-'0'==j) cntnum[j]++; } } } for(int i=0;i<b.length();i++){ if (b[i] >= 'a' && b[i] <= 'z') // 统计某个小写字母出现的次数 { a1[b[i]-'a']++;//小写检测 } else if(b[i] >= 'A' && b[i] <= 'Z') // 统计某大写字母出现的次数 { A1[b[i]-'A']++;//大写检测 }else{ for(int j=0;j<=9;j++){ if(b[i]-'0'==j) cntnum1[j]++; } } } for(int i=0;i<10;i++){ if(cntnum[i]<cntnum1[i]) need+=cntnum1[i]-cntnum[i]; } for(int i=0;i<26;i++){ if(a[i]<a1[i]) need+=a1[i]-a[i]; } for(int i=0;i<26;i++){ if(A[i]<A1[i]) need+=A1[i]-A[i]; } if(need<=0) cout<<"Yes"<<" "<<s.length()-b.length()<<endl; else cout<<"No"<<" "<<need<<endl; }
我的思路是先计算出卖家的珠子的种类及个数和买家需要的珠子的种类和个数,然后定义一个need变量,记录缺的珠子的个数,然后根据need的值,若need的值小于等于0,说明不缺珠子,输出“Yes”,多的珠子就是卖家的珠子数减去买家需要的珠子数;若need的值大于0,说明缺珠子,缺的个数就是need的值。