ECNU3510燃烧吧,室友!(模拟)

Posted chenxiaoran666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ECNU3510燃烧吧,室友!(模拟)相关的知识,希望对你有一定的参考价值。

点此看题面

大致题意: 给你一个只含\(C,H,O\)的化学式,问需要几\(mol\)的氧气才能使其完全燃烧成\(CO_2\)\(H_2O\)

模拟+化学

首先,我们模拟求出化学式中\(C,H,O\)的个数(这一部分请自行思考)。

然后,假设我们有\(C\)\(C\)\(H\)\(H\)\(O\)\(O\)

则我们共需要的\(O\)的个数为\(2C+\frac H2=\frac 4C+H2\),减去原有的\(O\)就是\(\frac4C+H-2O2\)

那么我们还需的氧气量就是这个式子再除以二,即\(\frac4C+H-2O4\)

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
using namespace std;
int n,T=1;string s;
struct element

    int C,H,O;I element(CI x=0,CI y=0,CI z=0):C(x),H(y),O(z)
    I void operator *= (CI x) C*=x,H*=x,O*=x;
    I void operator += (Con element& o) C+=o.C,H+=o.H,O+=o.O;
S[N+5];
int main()

    RI i,x=0,fg=0;char lst;for(cin>>s,s+="P",n=s.length(),i=0;i^n;++i)//模拟,求出C,H,O的数量
    
        if(isdigit(s[i])) x=(x<<3)+(x<<1)+(s[i]&15);continue;if(fg) S[T]*=x,S[T-1]+=S[T],--T,fg=x=0;
        else lst=='C'&&(S[T].C+=x?x:1),lst=='H'&&(S[T].H+=x?x:1),lst=='O'&&(S[T].O+=x?x:1),lst=x=0;
        if(s[i]=='(') x&&(S[T]*=x,x=0,fg&&(S[T-1]+=S[T],--T)),S[++T]=element();continue;
        if(s[i]==')') i^n&&isdigit(s[i+1])?fg=1:(S[T-1]+=S[T],--T);continue;lst=s[i]; 
    
    W(T>1) S[T-1]+=S[T],--T;long long t=4LL*S[1].C+S[1].H-2LL*S[1].O;//计算
    t%2?printf("%lld/4",t):(t%4?printf("%lld/2",t/2):printf("%lld/1",t/4));return 0;//约分后输出

以上是关于ECNU3510燃烧吧,室友!(模拟)的主要内容,如果未能解决你的问题,请参考以下文章

ECNU71一个游戏(水题)

mfix模拟流化床燃烧帮助收敛的方法

python模拟萌妹音让室友疯狂吃鸡

洛谷 P1994 有机物燃烧

模拟(进制)

2793_Deep_模拟