链接:https://ac.nowcoder.com/acm/contest/11210/D
来源:牛客网
题目描述
有 {S}S 种商品以及每种商品的数量,有 {N}N 个人,已知这 {N}N 个人都已有哪些商品,这些人只会购买他们没有的商品,求这 {N}N 个人购买完成后,剩余的商品种类数
输入描述:
第一行一个正整数 {T, T \le 50}T,T≤50,代表测试数据的组数
每组测试数据的第一行有两个整数 {S,1 \le S \le 100}S,1≤S≤100 和 {N, 1 \le N \le 100}N,1≤N≤100
接下来 {S}S 行每行一个字符串和一个数字表示一个商品
最后 {N}N 行,第 {i}i 行表示第 {i}i 个人已有的商品,每行先给出一个正整数 {k_i}k
i
,代表第 {i}i 个人已有的商品数量,之后有{k_i}k
i
个字符串,代表第 {i}i 个人拥有的商品名称
输入保证所有商品名称长度不超过 {128}128,并且所有商品名称都是以英文字母组成,每种商品的数量不会超过 {1000}1000
输出描述:
对于每组数据在一行中输出一个整数,表示剩余的商品种类数量
若剩余数量为{0}0,请在一行中输出 “Need to be lucky”
示例1
输入
复制
3
5 4
Tshirt 10
Watch 4
Towel 3
HandLight 10
LimitedBook 1
1 Tshirt
1 Tshirt
2 Tshirt Watch
2 Tshirt HandLight
2 2
LimitedCD 1
Handring 1
1 Handring
1 LimitedCD
2 2
ABCDEFGHIJKLMNOPQRSTUVWXYZ 1
abcdefghijklmnopqrstuvwxyz 1
1 ABCDEFGHIJKLMNOPQRSTUVWXYZ
1 ABCDEFGHIJKLMNOPQRSTUVWXYZ
输出
复制
3
Need to be lucky
1
思路:对所有商品用map记录其值,对第i个人没有的商品进行对map容器里的减一操作,如果直接操作会比较麻烦,不易操作,那么我们对第i个人已有的商品进行加一的操作,然后对所有商品进行减一操作,得到的效果一样且比较好实现。
直接上代码:
#include <iostream>
#include <map>
#include <string.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int s,n;
cin>>s>>n;
map<string,int> mp;
int num;
string str;
for(int i=0;i<s;i++){
cin>>str>>num;
mp[str]=num;
}
for(int i=0;i<n;i++){
int m;
cin>>m;
for(int j=0;j<m;j++){
cin>>str;
mp[str]++;
}
map<string,int>::iterator p;
for(p=mp.begin();p!=mp.end();p++){//这条语句等价于下面那条;
p->second --;
}
//for(auto &p : mp) p.second--;
}
int ans=0;
map<string,int>::iterator p2;
for(p2=mp.begin();p2!=mp.end();p2++){//同理可得;
if(p2->second>0){
ans++;
}
}
//for(auto &p2 : mp)
// if(p2.second>0) ans++;
if(ans==0) cout<<"Need to be lucky"<<endl;
else cout<<ans<<endl;
}
return 0;
}
代码中有一个相当重要的东西,for(auto &a:b)的使用,相当与STL容器中的迭代器,但是代码简洁,非常好用,亲测有效。
参考:https://blog.csdn.net/qq_37858386/article/details/114179275?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242