列表

详情


NC26009. 河北美食

描述

不知不觉当中,河北成为了一些人心中的“美食荒漠”,除了驴肉火烧,大抵想不起什么河北的美食了。大概是京津太过闪耀,盖过了冀菜的光芒。其实河北并不是美食荒漠,像邯郸的豆沫,石家庄的缸炉烧饼,唐山的酥糖,秦皇岛的皮皮虾,总能勾起心中最美好的回忆。
icebound最喜欢吃河北菜,于是他想要大厨做一桌河北菜宴请宾客。icebound购买了一些食材,并且制订了宴会的菜单。但是他并不知道这些食材是否足够,所以希望你写一个程序帮助他。
icebound将会给出每种食材的名称和数量,以及完整的菜单。菜单将包含每种菜品所需的食材及数量。菜单上的每道菜只需制作一次。

输入描述

第一行给出两个整数 n , m,分别代表食材种类和菜品数量。
第 二 到第 n+1 行,每行一个由小写字母组成的字符串 s_i 和一个数字 a_i,表示这种食材的名称和数量。
接下来 m 行,每行首先有一个整数 k,代表这种菜品所需的食材种类数。
随后将会有 k 个字符串,代表食材名称,每个字符串后跟有一个数字 t_i,用空格隔开,代表需要的食材数量。


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

输出描述

如果食材足够将菜单上的所有菜品全部制作一遍,请输出一行“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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 70ms, 内存消耗: 4836K, 提交时间: 2022-06-25 15:00:23

from collections import defaultdict

n,m = map(int,input().split())
mp = defaultdict(int)
for _ in range(n):
    k,v = input().split()
    mp[k] += int(v)
for _ in range(m):
    tmp = input().split()
    for i in range(1,len(tmp),2):
        ma,v = tmp[i],int(tmp[i+1])
        mp[ma] -= v
fl = True
for k,v in mp.items():
    if v < 0:
        fl = False
if fl:
    print("YES")
    for k,v in mp.items():
        if v == 0: continue
        print(k,v)
else:
    print("NO")

C++11(clang++ 3.9) 解法, 执行用时: 17ms, 内存消耗: 732K, 提交时间: 2020-02-26 11:24:30

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m,t,c;
	string s,str[1001];
	map<string,int>v;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		cin>>str[i]>>t;
		v[str[i]]=t;
	}
	while(m--)
	{
		cin>>c;
		while(c--)
		{
			cin>>s>>t;
			v[s]-=t;
			if(v[s]<0)
			{
				cout<<"NO\n";
				return 0;
			}
		}
	}
	cout<<"YES\n";
	for(int i=0;i<n;i++)
	{
		if(v[str[i]]>0)
		cout<<str[i]<<" "<<v[str[i]]<<endl;
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 20ms, 内存消耗: 872K, 提交时间: 2019-05-25 12:43:54

#include<bits/stdc++.h>
using namespace std;

int main (){
	map<string ,int > sc;
	string s,ss[10010];
	int m,n,a,b;
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>ss[i]>>a;
		sc[ss[i]]=a;
	}
	while(m--){
		cin>>b;
		while(b--){
			cin>>s>>a;
			sc[s]-=a;
			if(sc[s]<0)
			{
				cout<<"NO"<<endl;
				return 0;
			}
		}
	}
	cout<<"YES"<<endl;
	for(int i=0;i<n;i++){
		if(sc[ss[i]]>0)
		cout<<ss[i]<<" "<<sc[ss[i]]<<endl;
	}

} 

上一题