【算法题】CCF CSP第三题练习

 样例全部没问题,但是只有40分,不知道哪里出问题了:

#include <iostream>
#include <string>
#include <map>
#include <sstream>

using namespace std; 

class Fomular
{
private:
    string s, sr, sp;
    map<string,int> reactant;
    map<string,int> product;
    map<string,int> rElement;
    map<string,int> pElement;

    bool isLowercase(char a)
    {
        if (a >= ‘a‘ && a <= ‘z‘)
            return true;
        return false;
    }

    bool isUppercase(char a)
    {
        if (a >= ‘A‘ && a <= ‘Z‘)
            return true;
        return false;
    }

    bool isDigit(char a)
    {
        if (a >= ‘0‘ && a <= ‘9‘)
            return true;
        return false;
    }

    void split(string s, decltype(product) &m)
    {
        int a{0}, b{0}, i, j, tt;
        string t;
        for (i = 0; i < s.length(); i++)
        {
            if (s[i] == ‘+‘)
            {
                b = i;
                t = s.substr(a, b-a);
                for (j = 0; j < t.length() && isDigit(t[j]); ++j);
                stringstream ss;
                if (j == 0)
                    ss << "1";
                else
                    ss << t.substr(0, j);
                ss >> tt;
                m[t.substr(j, t.length()-j)] = tt;
                a = i+1;
            }
        }
        b = i;
        t = s.substr(a, b-a);
        for (j = 0; j < t.length() && isDigit(t[j]); ++j);
        stringstream ss;
        if (j == 0)
            ss << "1";
        else
            ss << t.substr(0, j);
        ss >> tt;
        m[t.substr(j, t.length()-j)] = tt;
    }

    void elemCnt(string fom, decltype(pElement) &pE, int mul = 1)
    {
        string t;
        int level{0}, num;
        for(int j = 0; j < fom.size(); j++)
        {
            if (isUppercase(fom[j]) && isDigit(fom[j+1]) && j+1 < fom.size())
            {
                t = string{fom[j]};
                int k = j+1;
                num = 0;
                while(isDigit(fom[k]) && k < fom.size())
                {
                    num *= 10;
                     num += fom[k] - ‘0‘;
                    k++;
                }
                if (num == 0)
                    num = 1;
                pE[t] += num * mul;
                j = k - 1;
            }
            else if (isUppercase(fom[j]) && isLowercase(fom[j+1]) && j+1 < fom.size())
            {
                t = string{fom[j]};
                t.append(string{fom[j+1]});
                int k = j+2;
                num = 0;
                while(isDigit(fom[k]) && k < fom.size())
                {
                    num *= 10;
                     num += fom[k] - ‘0‘;
                    k++;
                }
                if (num == 0)
                    num = 1;
                pE[t] += num * mul;
                j = k - 1;
            }
            else if (isUppercase(fom[j]))
            {
                t = string{fom[j]};
                pE[t] += mul;
            }
            else if (fom[j] == ‘(‘)
            {
                int numBack{1}, m, k;
                for (k = j; k < fom.size(); k++)
                {
                    if (fom[k] == ‘(‘)
                        level++;
                    else if (fom[k] == ‘)‘)
                    {
                        level--;
                        if (level == 0)
                            m = k;
                    }
                    if (level == 0 && isUppercase(fom[k]))
                        break;
                }
                numBack = 0;
                for (int a = m+1; a < k; a++)
                {
                    numBack *= 10;
                     numBack += fom[a] - ‘0‘;
                }
                if (numBack == 0)
                    numBack = 1;
                elemCnt(fom.substr(j+1, m-j-1), pE, numBack * mul);
                j = k;
            }
        }
    }

    void elemCount(decltype(product) &p, decltype(pElement) &pE)
    {
        for(auto i: p)
        {
            string fom{i.first};
            elemCnt(fom, pE, i.second);
        }
    }

public:
    Fomular(string s_)
    {
        int eq;
        s = s_;
        eq = s.find(‘=‘);
        sr = s.substr(0,eq);
        sp = s.substr(eq+1,s.length()-eq-1);
        split(sr, reactant);
        split(sp, product);
        elemCount(reactant, rElement);
        elemCount(product,  pElement);

        //----print------
        // for (auto i: rElement)
        // {
        //     cout << i.first << "#" << i.second << "  ";
        // }
        // cout << "=  ";
        // for (auto i: pElement)
        // {
        //     cout << i.first << "#" << i.second << "  ";
        // }
        // cout << endl;
        // ----print------
    }
    char getAnswer()
    {
        if (rElement.size() != pElement.size())
            return ‘N‘;
        for (auto i:rElement)
        {
            if(i.second != pElement[i.first])
                return ‘N‘;
        }
        return ‘Y‘;
    }

};

int main()
{
    int n;
    cin >> n;
    string s;
    getline(cin, s);
    for (int i = 0; i < n; ++i)
    {
        getline(cin, s);
        Fomular f{s};
        cout << f.getAnswer() << endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/joeyzhao/p/12255640.html

时间: 2024-08-30 15:15:11

【算法题】CCF CSP第三题练习的相关文章

经典算法题每日演练——第三题 猴子吃桃

原文:经典算法题每日演练--第三题 猴子吃桃 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多少个桃子? 分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了. 令S10=1,容易看出 S9=2(S10+1), 简化一下 S9=2S10+2 S8=2S

CCF CSP历年一二题代码汇总

实话说如果不是为了骗访问量,才不会写12题的qwq 201803-1 跳一跳 第一题向来是送分题...但是注意读题... 模拟题按题意走是坠稳的 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #define LL long long 6 #define debug(x) cout << "[" <&l

NOIP2005-普及组复赛-第三题-采药

题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大.” 如果你是辰辰,你能完成这个任务吗? 输入输出格式 Input/output 输入格式:输

2014百度之星资格赛第三题

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 7837    Accepted Submission(s): 3350 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Z

四川大学线下编程比赛第三题:书本转移

好久没写过日志,也怪最近事情真的特别多,最近参加关于编程方面就是CSDN高校俱乐部举办的线下编程塞,说起这次编程赛,总共三道题,题目都可以在csdn高校俱乐部上看到,参加比赛的时候有点小紧张,第三题涉及到队列,当时的机器没有代码提示,坑...也怨自己平时写代码用惯了代码提示,很多stl的方法都是隐隐约约知道,但是具体的不知道,导致第三题没有做出来,遗憾哈!下面贴一下今天写的第三题的代码 题目 四川大学线下编程比赛第三题:书本转移 题目详情: 小强有 3 个箱子 A,B,C 用来装书,所有的书(一

经典算法题每日演练——第二十题 三元组

原文:经典算法题每日演练--第二十题 三元组 我们知道矩阵是一个非常强大的数据结构,在动态规划以及各种图论算法上都有广泛的应用,当然矩阵有着不足的地方就是空间和时间 复杂度都维持在N2上,比如1w个数字建立一个矩阵,在内存中会占用1w*1w=1亿的类型空间,这时就会遇到outofmemory...那么面 临的一个问题就是如何来压缩矩阵,当然压缩的方式有很多种,这里就介绍一个顺序表的压缩方式:三元组. 一:三元组 有时候我们的矩阵中只有零星的一些非零元素,其余的都是零元素,那么我们称之为稀疏矩阵,

经典算法题每日演练——第十七题 Dijkstra算法

原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典策略,当然有的问题我们可以用贪心来寻求整体最优解,在图论中一个典型的贪心法求最优解的例子就莫过于“最短路径”的问题. 一:概序 从下图中我要寻找V0到V3的最短路径,你会发现通往他们的两点路径有很多:V0->V4->V3,V0->V1->V3,当然你会认为前者是你要找的最短 路径,那如

经典算法题每日演练——第七题 KMP算法

原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树是变态级的,那么kmp算法比红黑树还要变态,很抱歉,每次打kmp的时候,输 入法总是提示“看毛片”三个字,嘿嘿,就叫“看毛片算法”吧. 一:BF算法 如果让你写字符串的模式匹配,你可能会很快的写出朴素的bf算法,至少问题是解决了,我想大家很清楚的知道它的时间复 杂度为O(MN),原因很简单,主串和模

经典算法题每日演练——第六题 协同推荐SlopeOne 算法

原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,“商品推荐”,"猜你喜欢“,在实体店中我们有导购来为我们服务,在网络上 我们需要同样的一种替代物,如果简简单单的在数据库里面去捞,去比较,几乎是完成不了的,这时我们就需要一种协同推荐算法,来高效的推荐浏览者喜 欢的商品. 一:概念 SlopeOne的思想很简单,就是用均值化的思想来掩盖个体的打分差异,举个例子说明一下: 在这个图中,系统该如何计算“王五“对”电