20210427牛客小白月赛D—购物之c++11新增for()循环使用

24 篇文章 0 订阅
24 篇文章 0 订阅

链接: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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值