始终过不了#17
查看原帖
始终过不了#17
86624
洛谷Onlinejudge楼主2020/7/26 23:08
#include "bits/stdc++.h"
using namespace std;

string Name;
int N;

inline double Element(int Start){
	if(Name[Start]=='H'){
		if(Name[Start+1]=='f')return 178.5;
		if(Name[Start+1]=='g')return 201.0;
		return 1.0;
	}
	if(Name[Start]=='A'){
		if(Name[Start+1]=='l')return 27.0;
		if(Name[Start+1]=='g')return 108.0;
		if(Name[Start+1]=='u')return 197.0;
	}
	if(Name[Start]=='C'){
		if(Name[Start+1]=='l')return 35.5;
		if(Name[Start+1]=='u')return 64.0;
		if(Name[Start+1]=='a')return 40.0;
		return 12.0;
	}
	if(Name[Start]=='N'){
		if(Name[Start+1]=='a')
			return 23.0;
		return 14.0;
	}
	if(Name[Start]=='M'){
		if(Name[Start+1]=='n')return 55.0;
		if(Name[Start+1]=='g')return 24.0;
	}
	if(Name[Start]=='F'){
		if(Name[Start+1]=='e')
			return 56.0;
		return 19.0;
	}
	if(Name[Start]=='S'){
		if(Name[Start+1]=='i')
			return 28.0;
		return 32.0;
	}
	if(Name[Start]=='P'){
		if(Name[Start+1]=='t')
			return 195.0;
		return 31.0;
	}
	if(Name[Start]=='O')return 16.0;
	if(Name[Start]=='K')return 39.0;
	if(Name[Start]=='Z'&&Name[Start+1]=='n')
		return 65.0;
	if(Name[Start]=='L')return 127.0;
	if(Name[Start]=='B'&&Name[Start+1]=='a')
		return 137.0;
}

inline double ReadNum(int Start,int Max){
	double Sum=0;
	for(register int i=Start;Name[i]>='0'&&Name[i]<='9'&&i<=Max;i++)
		Sum=Sum*10+(Name[i]-'0');
	return Sum;
}

inline double Search(int L,int R){
	double Sum=0;
	for(register int i=L;i<=R;i++){
		if(Name[i]=='~'){
			if(Name[i+1]<'0'||Name[i+1]>'9'){
				Sum+=18.0;
				break;
			}
			Sum+=(ReadNum(i+1,R))*18.0;
			break;
		}
		if(Name[i]=='('){
			int j=i;
			while(Name[j]!=')')
				j++;
			double Add=Search(i+1,j-1);
			i=j;
			if(Name[i+1]=='_'){
				i+=3;
				double Mul=0;
				while(Name[i]>='0'&&Name[i]<='9'){
					Mul=Mul*10+(Name[i]-'0');
					i++;
				}
				Add*=Mul;
			}
			Sum+=Add;
		}
		if(Name[i]>='A'&&Name[i]<='Z'){
			#define OK1 Name[i]>='A'&&Name[i]<='Z'
			#define OK2 Name[i]>='a'&&Name[i]<='z'
			double Add=0,Last=0;
			while(i<=R&&((OK1)||(OK2))){
				if(OK1)
					Add+=Element(i),Last=Element(i);
				i++;
			}i--;
			if(Name[i+1]=='_'){
				i+=3;
				Add-=Last;
				double Mul=0;
				while(Name[i]>='0'&&Name[i]<='9'){
					Mul=Mul*10+(Name[i]-'0');
					i++;
				}
				Last*=Mul;
				Add+=Last;
			}
			Sum+=Add;
		}
	}
	return Sum;
}

int main(void){
	cin>>Name;
	N=Name.size();
	double Sum=Search(0,N-1);
	if(Sum!=(int)Sum)
		printf("%.1f\n",Sum);
	else printf("%d\n",(int)Sum); 
	return 0;
}
2020/7/26 23:08
加载中...