本题思路
用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;
    }
}