社区讨论

蒟蒻求助,模拟TLE是什么操作

P4711「化学」相对分子质量参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi7cm93d
此快照首次捕获于
2025/11/20 19:29
4 个月前
此快照最后确认于
2025/11/20 19:29
4 个月前
查看原帖
CPP
#include<cstdio>
#include<string>
#include<cstring>
#include<map>
#include<iostream>
using namespace std;
string ss;
char s[20000];
int len,now=0;
map<string,double> che;
void Deal_first() {
    che["H"]=1;
    che["C"]=12;
    che["N"]=14;
    che["O"]=16;
    che["F"]=19;
    che["Na"]=23;
    che["Mg"]=24;
    che["Al"]=27;
    che["Si"]=28;
    che["P"]=31;
    che["S"]=32;
    che["Cl"]=35.5;
    che["K"]=39;
    che["Ca"]=40;
    che["Mn"]=55;
    che["Fe"]=56;
    che["Cu"]=64;
    che["Zn"]=65;
    che["Ag"]=108;
    che["I"]=127;
    che["Ba"]=137;
    che["Hf"]=178.5;
    che["Pt"]=195;
    che["Au"]=197;
    che["Hg"]=201;
}
double solve_R()
{
	string p=ss.substr(now,2);
	if(che.count(p)) {now+=2;return che[p];}
	else {now++;return che[ss.substr(now-1,1)];}
}
double solve_sum()
{
	now+=2;
	double num=0;
	while(s[now]>='0'&&s[now]<='9') num=num*10+s[now]-'0',now++;
    now++;
    return num;
}
double solve_H2O()
{
	now++;
	double p=1,num=0;
	while(s[now]>='0'&&s[now]<='9')  {num=num*10+s[now]-'0',now++;}
	if(num!=0) p=num;
	now=len;
	return p*18.0;
}
double dfs()
{
	double R,sum=0;
	  while(s[now]!=')')
     {
	  if(s[now]>='A'&&s[now]<='Z') 
	  {
	  	double p=1;
	    R=solve_R();
	    if(s[now]=='_')  p=solve_sum();
	    sum+=p*R;
      }
	  else if(s[now]=='(') 
	  {
	  	 double p=1;
	 	 now++; 
		 R=dfs();
		 if(s[now]=='_')  p=solve_sum();
		 sum+=p*R;
	  }
	  else if(s[now]=='~') sum+=solve_H2O();
    }
    now++;
    return sum;
} 
int main()
{
	Deal_first();
	cin>>ss;
	len=ss.size();
	for(int i=0;i<ss.size();++i) s[i]=ss[i];
	s[len]=')';
	now=0;
	cout<<dfs();
}

回复

3 条回复,欢迎继续交流。

正在加载回复...