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



京公网安备 11010502036488号