• 一道小模拟——洛谷 P4711 「化学」相对分子质量


    传送门

    这一行为了便于点击链接(否则会触发标题鼠标特效)

    屠龙宝刀点击就送

    这一行为了便于点击链接(否则会触发标题鼠标特效)

    题意

    给出分子式,求相对分子质量。

    可能是水合物。

    但括号(指的是一般化学意义上的括号)没有嵌套。

    关于

    一百行的模拟我都要想一年,我真的菜啊

    但是练练细心和码风还是相当有意义的

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    
    string his;
    int water,ans;
    
    inline int getint(int &x){//从x起是数 
    	if(x==water&&his[x]=='H')return 1;
    	if(x>=his.size())return 0;
    //	cout<<"getint"<<x<<endl;
    	int fuck=0;
    	while(his[x]>='0'&&his[x]<='9'){
    		fuck=fuck*10+his[x]-'0';
    		x++;
    	}
    	return fuck;
    }
    
    inline int getm(char a){
    //	cout<<"getm"<<a<<endl;
    	if(a=='H')return 2;
    	if(a=='C')return 24;
    	if(a=='N')return 28;
    	if(a=='O')return 32;
    	if(a=='F')return 38;
    	if(a=='P')return 62;
    	if(a=='S')return 64;
    	if(a=='K')return 78;
    	if(a=='I')return 254;
    }
    
    
    inline int getm(char a,char b){
    //	cout<<"getm"<<a<<b<<endl;
    	if(a=='N'&&b=='a')return 46;
    	if(a=='M'&&b=='g')return 48;
    	if(a=='A'&&b=='l')return 54;
    	if(a=='S'&&b=='i')return 56;
    	if(a=='C'&&b=='l')return 71;
    	if(a=='C'&&b=='a')return 80;
    	if(a=='M'&&b=='n')return 110;
    	if(a=='F'&&b=='e')return 112;
    	if(a=='C'&&b=='u')return 128;
    	if(a=='Z'&&b=='n')return 130;
    	if(a=='A'&&b=='g')return 216;
    	if(a=='B'&&b=='a')return 274;
    	if(a=='H'&&b=='f')return 357;
    	if(a=='P'&&b=='t')return 390;
    	if(a=='A'&&b=='u')return 394;
    	if(a=='H'&&b=='g')return 402;
    }
    
    inline int getlow(int &x){
    	if(x==his.size())return 1;
    //	cout<<"getlow"<<x<<endl;
    	x+=2;
    	int fuck=getint(x);
    	x++;
    	return fuck;
    }
    
    inline int calele(int &x){//Ca_{2}
    	if(x==his.size())return 0;
    //	cout<<"calele"<<x<<endl;
    	int fuck;
    	if(his[x+1]>='a'&&his[x+1]<='z'){
    		fuck=getm(his[x],his[x+1]);
    		x+=2;
    	}
    	else {
    		fuck=getm(his[x]);
    		x++;
    	}
    	if(his[x]=='_')fuck*=getlow(x);
    	return fuck;
    }
    
    inline int calsec(int &x){//Ca_{2}或 (Ca_{2}K_{2})_{2}
    	if(x==his.size())return 0;
    //	cout<<"calsec"<<x<<endl;
    	int fuck=0;
    	if(his[x]=='('){
    		x++;
    		while(his[x]>='A'&&his[x]<='Z')fuck+=calele(x);
    		x++;
    		if(his[x]=='_')fuck*=getlow(x);
    		return fuck;
    	}
    	else return calele(x);
    }
    
    int main(){
    	cin>>his;
    	water=his.find('~');
    	if(water==-1)water=his.size();
    	for(int i=0;i<water;)ans+=calsec(i);
    	//第12个点WA笔记:H2O前面可能没有系数 
    	water++;int fuck=ans+36*getint(water);
    	if(fuck&1)printf("%d.5
    ",fuck>>1);
    	else printf("%d
    ",fuck>>1);
    }
    
  • 相关阅读:
    循环
    pl/sql小结
    poi编程
    Activiti工作流面试相关知识!
    工作流学习——Activiti流程变量五步曲
    工作流学习——Activiti流程实例、任务管理四步曲
    工作流学习——Activiti流程定义管理三步曲
    工作流学习——Activiti整体认识二步曲
    工作流学习——重要概念扫盲篇一步曲
    Activiti工作流数据库表详细介绍(23张表)
  • 原文地址:https://www.cnblogs.com/Y15BeTa/p/11846146.html
Copyright © 2020-2023  润新知