NYOJ542试制品,<虐心模拟题>

试 制 品

时间限制: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。其中AiBj都是一种单质或化合物的化学式(长度不超过10个字符),1≤p,q ≤ 20 。每个方程式的总长不超过100个字符。有些试制品的化学式可能在现代社会的化学元素周期表里找不到,这是由于化学反应过程中可能又有物理反应导致的结果。

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

输入
有多组测试数据。

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

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

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

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

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

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

样例输入
4H2O+Na=NaOH+H2Cl2+H2=HClFe+O2=Fe3O4NaOH+HCl=H2O+NaCl3H2ONa	Cl2
样例输出
4H2HClNaClNaOH
来源
第五届河南省程序设计大赛
上传者

ACM_李如兵

思路:

由于数据很小那么就无限遍历方程式,把已有的物质放入map中,分解方程式,让判断该方程是否发生,发生就把生成的物质放入map中,当有一轮没有新方程发生就表示不会再有发生了

#include<bits/stdc++.h>
using namespace std;
struct fcs
{
    string sz;
    bool fs;//方程式,有fs标记发生否
}a[444];
int main()
{
    int n,m,i,j;
    while(scanf("%d",&n)==1)
    {
        for(i=0;i<n;++i)
        {
            cin>>a[i].sz;
            a[i].fs=false;
        }
        scanf("%d",&m);
        map<string,bool> jb;//用map表示已有物质右点Bool表示的是生成物还是反应物
        for(i=0;i<m;++i)
        {
            string s;
            cin>>s;
            jb[s]=false;
        }
        bool sad=true;//标记变量当判断是否有方程式发生
        while(sad)
        {
            sad=false;
            for(i=0;i<n;++i)
            {
                if(a[i].fs)//该方程发生过就不看
                    continue;
                int len,gfs=0;
                string wz;//分解方程得出单个物质
                for(j=0,len=a[i].sz.size();j<len;++j)
                {
                    if(a[i].sz[j]=='+'||a[i].sz[j]=='=')//+或等于结束
                    {
                        if(!jb.count(wz))//表示的是该物质不存在直接退出
                            break;
                        wz="";
                        if(a[i].sz[j]=='=')//等号的时候表示的是所有物质都有该方程能发生
                        {
                            a[i].fs=true;//标记这个方程式为发生过
                            sad=true;//该轮有物质生成
                            gfs=1;//标记
                            break;
                        }
                        continue;
                    }
                    wz+=a[i].sz[j];//连接
                    //if(a[i].sz[j]!='+'&&a[i].sz[j]!='=')
                }
                if(gfs)//把生成物加入
                {
                    wz="";
                    for(++j;j<len;++j)//
                    {
                        if(a[i].sz[j]=='+')
                        {
                            if(jb.count(wz))//生成物质要判重
                            {
                                wz="";
                                continue;
                            }
                            jb[wz]=true;//insert
                            wz="";
                            continue;
                        }
                        wz+=a[i].sz[j];
                    }
                    if(!jb.count(wz))//最后一个也要判重,第一次交WA了
                    jb[wz]=true;
                }
            }
        }
        cout<<(jb.size()-m)<<endl;
        map<string,bool>::iterator p=jb.begin();
        while(p!=jb.end())//输出
        {
            if(p->second)
                cout<<p->first<<endl;
            p++;
        }
    }
    return 0;
}

大一的时候这个题写了两天,心都碎了,过了一年重新再来一次,感觉还不错

时间: 2024-10-01 05:23:01

NYOJ542试制品,<虐心模拟题>的相关文章

poj 1008:Maya Calendar(模拟题,玛雅日历转换)

Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64795   Accepted: 19978 Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old Maya calendar. From an old knotted message, profes

8.22 NOIP 模拟题

  8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc 4.9.2 fpc 2.6.2 评测环境 64 位 Linux, 3.3GHZ CPU 评测软件 Lemon 评测方式 忽略行末空格和回车 特别注意:c/c++ 选手使用 printf 输出 64 位整数请使用%lld 1 注意事项 A 债务 文件名                            输入文件             输出文件  

更新 | 2019年9月计算机二级office模拟题库

随着2019年上半年计算机二级考试的完美落幕,紧接着的便是9月份的考试了. 到目前为止,下半年9月份计算机二级考试报名开通时间在6月前后,现在也基本结束. 2019年9月(56次)全国计算机等级考试(以下简称NCRE)将于9月中旬举行.已经报名的同学请利用暑期时间好好准备吧! > 2019年9月份最新二级题库看文末 ▼ 公众号内回复关键词:2305获取下载链接 考前学习 计算机二级考试方法为机考,时间为120分钟,分数100分.得60分以上则通过考试. || 好好打基础,温习知识点 不管是自学考

HDU 4028 The time of a day STL 模拟题

暴力出奇迹.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define ll __int64 #define N 42 ll n,m,ans;

cf428c 模拟题

这题说的是给了 n个数然后又 k次 的交换任意位置的 数字的机会  计算最长的连续子序列的和 这要撸  模拟整个 过程 并不能就是算最长的递增序列 如果只是 找最长的 和序列的 话 会存在 很多问题 在替换的时候 每一个决策 都影响着 下一个决策  这样 存在谁与谁替换 这样的状态有 200!种    那就枚举每个区间这样就可以使得 我们所用替换方法得当  因为在替换中我们进行替换是对不同区间的 操作 比如 在替换序列之内的 数字的时候 其实操作的就是不同的区间 与外面的序列进行替换的时候 操作

TOJ1290 Poker Hands 模拟题

寒假期间抽空做的一道模拟题 难度不算大,把每种牌型分开处理,可以合并的步骤考虑合并. 代码比较丑陋,首次尝试Sport Programming的风格,结果搞了个不伦不类(手动笑哭) 1 #include <algorithm> 2 #include <bitset> 3 #include <cctype> 4 #include <complex> 5 #include <cstdio> 6 #include <cstring> 7 #

hdu 5641 King&#39;s Phone(暴力模拟题)

Problem Description In a military parade, the King sees lots of new things, including an Andriod Phone. He becomes interested in the pattern lock screen. The pattern interface is a 3×3 square lattice, the three points in the first line are labeled as

HDU 2414 Chessboard Dance(模拟题,仅此纪念我的堕落)

题目 模拟题也各种wa,我最近真的堕落了,,,,,智商越来越为负数了!!!!!!!! #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char mp[10][10]; int d=-1;//0shang,1xia,2zuo,3you int x,y;//weizhi int weizhi(int i,int j) { if(mp[i][j]=='<'){x=

HDU 4930 Fighting the Landlords(扯淡模拟题)

Fighting the Landlords 大意: 斗地主....   分别给出两把手牌,肯定都合法.每张牌大小顺序是Y (i.e. colored Joker) > X (i.e. Black & White Joker) > 2 > A (Ace) > K (King) > Q (Queen) > J (Jack) > T (10) > 9 > 8 > 7 > 6 > 5 > 4 > 3. 给你8种组合:1.