鹏鹏的积木

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

题目描述

鹏鹏最近喜欢上了玩积木,他现在很多种积木,还有一些玩具图纸,他现在想知道他能不能把所有的玩具全部拼出来。

输入描述:

第一行两个整数n,m,n表示积木的种类,m表示图纸的数量。

接下来n行,每行有一个字符串si 表示某种积木的名称,后面跟一个整数ai表示该种积木的数量。字符串与数字之间会以空格隔开。

然后m行,每行首先有一个整数k,表示该玩具需要的积木种类数。

随后有k个字符串,表示积木名称,每个字符串后跟一个数字ti,表示该种积木所需的数量。字符串与数字之间空格隔开。

1≤n,m≤1000,1≤k≤1000 且 k≤n

0≤ai,ti≤1e9,1≤|si|≤25

输出描述:

保证输入合法,积木名称不会相同,且图纸中不会有未出现的积木。如果所有积木足够将所有图纸的玩具全部制作一遍,请输出一行“YES”,
并且按照输入顺序输出剩下的积木名称以及对应的数量,每行一种积木,用空格将名称和其数量隔开。
如果某种积木全部被用完,则不输出该积木。
如果不能,输出一行“NO”。

示例1

输入

5 3
water 100
flour 20
cabbage 71
pork 12
bean 5
2 water 20 flour 5
3 water 70 cabbage 54 pork 10
5 water 1 flour 1 cabbage 1 pork 2 bean 1

输出

YES
water 9
flour 14
cabbage 16
bean 4

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct zifu{
    string l;
}xiba;//建立一个结构体,后续按照输入顺序输出剩下积木名称
int main(){
    int n,m;
    std::cin>>n>>m;
    map<string,ll> p;//使用map来当计数器
    xiba a[n];
    ll x;
    for(int i=0;i<n;i++){
        std::cin>>a[i].l>>x;
        p[a[i].l]=x;
    }
    ll k,y;
    string s;
    while(m--){
        std::cin>>k;
        for(int i=0;i<k;i++){
            std::cin>>s>>y;
            p[s]-=y;
        }
    }
    int flag=0;//标记是或者否
    for(auto it=p.begin();it!=p.end();it++){//判断所有积木是否足够将所有图纸的玩具全部制作一遍
        if(it->second<0){
            flag=1; break;
        }
    }
    if(flag==1)//否
        std::cout<<"NO";
    else{
        std::cout<<"YES\n";//是,输出时判断一下剩余积木的数量是否等于0,等于0的不输出。
        for(int i=0;i<n;i++){
            if(p[a[i].l]>0)
                std::cout<<a[i].l<<" "<<p[a[i].l]<<"\n";
        }
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油小鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值