nyoj 542 试 制 品

题目:

试 制 品

时间限制:1000 ms  |  内存限制:65535 KB

难度:4

描述

ZZ大学的Dr.Kong最近发现实验室的很多试制品都已经用完。由于项目经费有限,为了节省,Dr.Kong决定利用实验室现有的试制品来生成所缺的试制品。为此,Dr.Kong连续几天通宵达旦整理出一份研究资料并让研究生Bill去实验并统计能产生多少种所缺的试制品。

Bill从头到尾翻完所有的资料,发现资料上写满了一大堆的化学方程式,上面除了大小写英文字母、数字、加号、等号外,再也没有其他的符号了。其中,每个方程式都是A1+A2+……+Ap=B1+B2+……+Bq的形式, 表示试制品A1,A2,……和Ap反应,生成了试制品B1,B2,……,Bq。其中Ai和Bj都是一种单质或化合物的化学式(长度不超过10个字符),1≤p,q ≤ 20 。每个方程式的总长不超过100个字符。有些试制品的化学式可能在现代社会的化学元素周期表里找不到,这是由于化学反应过程中可能又有物理反应导致的结果。

Bill头疼了,从哪个实验开始呢?你能帮助他吗?

输入

有多组测试数据。

第一行:N表示Dr.Kong写的化学方程式个数(1<=N<=400)

接下来有N行, 每一行是一个方程式.

再接下来的一行:M表示已有多少种试制品.(1<=M<=500)

接下来有M行,每一行是已有的一种试制品的化学式.

输出

第一行包含一个数T,表示可以产生多少种所缺的试制品.

在接下来的T行中,按ASCII码升序输出产生的试制品的化学式.

样例输入

4

H2O+Na=NaOH+H2

Cl2+H2=HCl

Fe+O2=Fe3O4

NaOH+HCl=H2O+NaCl

3

H2O

Na

Cl2

样例输出

4

H2

HCl

NaCl

NaOH

来源

第五届河南省程序设计大赛

题目大意:

给一个给m个化学方程式,n个物品,求能合成多少个其他物品

题目思路:

1、将化学方程式分解成个各物品

2、用map将物品转换成编号。有的要记录

3、循环搜索方程式,一旦有新的物品加入,就得在遍历一边。

4、.map开始遍历,如果有且不为原来就输出

程序:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cctype>
#include <fstream>
#include <limits>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cassert>
using namespace std;
bool fv[3000];//最初给的
bool v[30000];//元素有没有
bool vv[500];//方程式成立不
int m,n;
struct formula
{
    int in[30];//方程式需要的
    int out[30];//方程式输出的
    int in_len;
    int out_len;
};
int main()
{
    while(~scanf("%d",&m))
    {
        formula a[500];
        map<string,int>ma;

        int num=1;
        string s;
        for(int i=0; i<m; i++)
        {

            cin>>s;
            int len=s.length();
            int w=0,f=0;
            for(int j=0; j<len; j++)
                if(!(s[j]=='+'||s[j]=='\0'))
                {
                    if(s[j]=='=')
                    {
                        f=1;
                        w=0;
                        continue;
                    }
                    int k;
                    for(k=j+1; k<=len; k++)
                        if(s[k]=='+'||s[k]=='\0'||s[k]=='=')
                            break;
                    string ss(s,j,k-j);//提取出来物品
//                cout<<f<<ss<<'\t';
                    if(!ma[ss])
                        ma[ss]=num++;
                    if(!f)a[i].in[w++]=ma[ss];
                    else a[i].out[w++]=ma[ss];
                    if(!f)a[i].in_len=w;
                    else a[i].out_len=w;
                    j=k-1;
                }
            //cout<<endl;
        }
        scanf("%d",&n);
        memset(fv,0,sizeof(fv));
        memset(v,0,sizeof(v));
        memset(vv,0,sizeof(vv));
        for(int i=0; i<n; i++)//记录出事的物品
        {
            cin>>s;
            if(ma[s])
            {
                v[ma[s]]=1;
                fv[ma[s]]=1;
            }
        }
        int f=1;//更新就循环
        while(f)
        {
            f=0;
            for(int i=0; i<m; i++)
                if(!vv[i])
                {
                    int j;
                    for( j=0; j<a[i].in_len; j++)
                        if(!v[a[i].in[j]])
                            goto en;//化学反应不足
                    for( j=0; j<a[i].out_len; j++)
                        v[a[i].out[j]]=1;
                    f=1;
                    vv[i]=1;
en:
                    ;
                }
        }
        int ans=0;
        map<string ,int>::iterator it;//遍历
        for(it=ma.begin(); it!=ma.end(); it++)
            if(v[it->second]&&!fv[it->second])
                ans++;
            cout<<ans<<endl;
        for(it=ma.begin(); it!=ma.end(); it++)
            if(v[it->second]&&!fv[it->second])
                cout<<it->first<<endl;
    }
    return 0;
}
时间: 2024-10-19 17:36:51

nyoj 542 试 制 品的相关文章

[河南省ACM省赛-第五届] 试制品 (nyoj 542)

模拟 a 反应物集合 ; b 生成物集合; c 存在的化合物或单质集合; ans 新生成化合物集合 1.如果反应无均在已生成的化合物集合中,则完成反应,将合成物加入c集合 2.对每个方程式的反应物进行排序,方便加速查找 3.不停的搜索,直到没有新化合物生成. #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #inc

NYOJ 542 试制品(第五届河南省省赛)

解法不唯一,但是还是set好理解而且用着爽,代码注释应该够详细了 #include<stdio.h> #include<string.h> #include<math.h> #include<time.h> #include<iostream> #include<ctype.h> #include<map> #include<set> #include<string> #include<vec

NYOJ542试制品,&lt;虐心模拟题&gt;

试 制 品 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ZZ大学的Dr.Kong最近发现实验室的很多试制品都已经用完.由于项目经费有限,为了节省,Dr.Kong决定利用实验室现有的试制品来生成所缺的试制品.为此,Dr.Kong连续几天通宵达旦整理出一份研究资料并让研究生Bill去实验并统计能产生多少种所缺的试制品. Bill从头到尾翻完所有的资料,发现资料上写满了一大堆的化学方程式,上面除了大小写英文字母.数字.加号.等号外,再也没有其他的符号了.其中,每个方程

熊文修被通报严重违纪 曾任河南警察学院党委书记

Riddle do I say? No! it was a riddle no longer, save as to the visit of the Contessa to the vault of her family, for otherwise everything was clear enough. She had met Pallanza at Rome, and had fallen in love with his handsome face. The young man, fl

书乐说:爆款的溃败,谁在给莫斯利安挖坑?

对于光明乳业来说,莫斯利安身上承载了太多的"光明". 文/张书乐 刊载于<销售与市场>管理版2016年7月刊 作为国内第一款常温酸奶.光明用来转型的创新产品.连续多年销售额爆发的明星单品,莫斯利安是寄托了光明百亿销量期望值的爆款.而这一切,在2015年戛然而止. 4月19日,光明乳业发布的2015年年度报告显示,2015年光明乳业营业收入约193.73亿元,较上年同期下滑6.18 %.而在这份财报中,2015年莫斯利安的销售收入为58.74亿元,出现了1.44%的微降事实,

社交柔道术 - 《影响力》读书笔记(一)

 看多了韩剧中的长腿欧巴便觉得自己的男朋友缺乏魅力,看多了杂志上的美女照片便也对普通的女生提不起兴趣,这听起来可笑的趣事里,其实包含了人类认知的一个基本原理:"对比原理".这也就是为什么优秀的销售员会先带你看最贵的衣服,因为在对比之下,价格合理的衣服才会显得更有吸引力. 人类虽然已经进化了上万年,但依旧和低等动物一样,会时常陷入"固定行为模式"中.只要一旦有了正确的触发器,内置的行为卡带便开始播放起来.比如"一分钱一分货","只要使

Atitit.研发管理---TOGAF架构跟 (ADM开发方法)总结

Atitit.研发管理---TOGAF架构跟 (ADM开发方法)总结 1. TOGAF是在过去二十年间出现的企业架构框架 1 2. TOGAF内容结构 1 3. TOGAF 实现过程 2 4. 参考 4 1. TOGAF是在过去二十年间出现的企业架构框架 ,其目标是成为 EA 开发的标准.TOGAF 是由 Open Group consortium 成员创建的, TOGAF 不是一开始就体现整体的 EA 焦点.最初,TOGAF 只包括技术架构(版本 1 到 7),然而,最近该框架中加入了业务架构

[书目20160516]改变生活的66种方式

一.饮食--打好健康的基础 1.一定要吃早餐 2.饮酒绝不过量 3.少喝碳酸饮料 4.多吃一些素食 5.多喝白开水 6.尽量在家吃饭 7.试着品品茶 8.经常吃些水果 二.让运动为生命带来活力 9.为静坐抽出时间 10.不要忘记锻炼大脑 11.尽量走楼梯而不坐电梯 12.创造条件跑跑步 13.在短时间内让自己出汗 14.学会正确的呼吸 15.创造条件游游泳 16.试着当当走班族 三.良好心态决定生活质量 17.保持心理平衡 18.学会适当放弃 19.勇敢面对人生低谷 20.越过自卑的樊篱 21.

标准成本与实际成本的区别简述

标准成本法与实际成本法并无优劣之分,关键是根据企业的特点选择合适的方法. 采用标准成本相对实际成本核算简单. 简而言之: 采用标准成本法, 无论入库还是领用, 按照确定标准入账, 根据发票调整差异: 采用实际成本法, 每次入库时根据按实际成本记录, 每次入库成本都有可能不同,领用时就会复杂一些,需要按成本计价方式计算出库的成本, 增加了出库价格的确定工作, 比标准成本工作量大, 比如采用移动加权平均法时, 每次出库 时的价格都要进行计算, 同时还要根据材料领用的情况调整存货和在制品. 要是再遇到