本题思路
用map存每件商品的总件数,
由于这些人只会购买他们没有的商品,
所以我的思路是在保存每件商品总件数的时候直接减去总人数,当作每个人每件商品都需要
让所有人都买了所有商品,
这样在后面读入每个人拥有的商品的时候,
有哪件那件就加1,相当于还回去。
举例说明:
假设商店有:
A 4
B 3
C 2
D 2
一共三个人分别拥有:
2 A B
2 A B
3 A B C
由于计算总商品时先减去人数 所以存入的结果:
A:1 B:0 C:-1 D:-1
再在读入每人拥有的商品时,只要拥有哪件商品就不需要买哪件,所以那件商品的总数量就加一
A出现了三次 A+3->4 、
B出现了三次 B+3->3
C出现了一次 C+1->0
D出现了零次 D+0->-1
所以只要大于0就说明商品没卖完 小于等于0就说明卖完了
最后对所有商品遍历,大于0就算还有剩余
#include<iostream> #include<string> #include<map> using namespace std; int main() { int zus,n,s,t,i,k; string str; string sp[101];//用来存商品名字 cin>>zus; map<string,int> mp; while(zus--) { cin>>s>>n; k=0; getchar(); for(i=0;i<s;i++) { getline(cin,str,' '); sp[i]=str; cin>>mp[str]; mp[str]-=n;//减去人数 getchar(); } for(i=0;i<n;i++) { cin>>t;getchar(); //t记录有几件商品 如果有多件 最后一件之前的输入以空格为结尾 最后一件输入以换行为结尾 while(t!=1) { getline(cin,str,' ');mp[str]++; t--; } if(t==1) { getline(cin,str);mp[str]++; } } for(i=0;i<s;i++) { if(mp[sp[i]]>0)k++; } if(!k) { cout<<"Need to be lucky"; } else cout<<k; if(zus)cout<<endl; } }