zoukankan      html  css  js  c++  java
  • 【ECNU3510】燃烧吧,室友!(模拟)

    点此看题面

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

    模拟+化学

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

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

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

    那么我们还需的氧气量就是这个式子再除以二,即(frac{4C+H-2O}4)

    代码

    #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;//约分后输出
    }
    
  • 相关阅读:
    linux poll 和 select
    linux测试 scullpipe 驱动
    linux进程唤醒的细节
    linux进程互斥等待
    linux 手动睡眠
    linux一个进程如何睡眠
    [POJ 2431]Expedition
    【MongoDB数据库】MongoDB 命令入门初探
    高速排序为什么快?
    [050] 微信公众平台开发入门视频教程已公布
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/ECNU3510.html
Copyright © 2011-2022 走看看