吃货阿生

Description

 

阿生的朋友都知道阿生是个吃货,吃对于他来说就是生活中必不可少的一件事。阿生最近突然想自己制作一些没吃过的美食。因此他买了一些原料。但是他并不知道这些原料是否足够,所以希望你写一个程序帮助他。

阿生将会给出每种原料的名称和数量,以及一道完整的菜所需要的原料。它包含每种菜所需的原料及数量。并且每道菜只需制作一次。

Input

 

第一行给出两个整数 n , m,分别代表原料种类和菜品的数量。

第 二 到第 n+1 行,每行一个由小写字母组成的字符串si和一个数字ai,表示这种原料的名称和数量。

接下来 m 行,每行首先有一个整数 k,代表这种菜品所需的原料种类数。

随后将会有 k 个字符串,代表原料名称,每个字符串后跟有一个数字ti​,用空格隔开,代表需要的原料数量。

1 <= n,m <= 1000, 1 <= k<= 10,且 k<=n

1 <= ai,ti <= 10^9, 1<= | si | <= 20

保证输入合法,原料名称不会相同,且菜谱中不会有未出现的食材。

Output

 

如果原料足够将菜单上的所有菜品全部制作一遍,请输出一行“YES”,并且按照输入顺序输出剩下的食材以及对应的数量,每行一个食材,用空格将食材和其数量隔开。如果某种食材全部被用完,则不输出该食材。

如果不能,输出一行“NO”。

Sample Input 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

Sample Output 1

YES
water 9
flour 14
cabbage 16
bean 4

 

map存食材,然后顺序输出得了~~

#include<iostream>
#include<map> 
using namespace std;
string str[1000];
int main(){
	int m,n;
	cin>>m>>n;
	map<string,int>cai;
	for(int i=0;i<m;i++){
		string s;
		int l;
		cin>>s>>l;
		str[i]=s;
		cai[s]=l;
	}
	for(int i=0;i<n;i++){
		int k;
		cin>>k;
		while(k>0){
			k--;
			string s;
			int l;
			cin>>s>>l;
			if(cai[s]>=l){
				cai[s]-=l;
			}
			else{
				cout<<"NO";
				return 0;
			}
		} 
	}
	cout<<"YES"<<endl;
	for(int i=0;i<m;i++){
		if(cai[str[i]]==0){
			continue;
		}
		cout<<str[i]<<" "<<cai[str[i]]<<endl;
	}
	return 0;
}