链接:登录—专业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;
}