题目链接
这个题干很好理解就是求一个化学式的相对分子质量,只是这里可能会存在括号的情况,起初我想的就是直接暴力模拟确实可以求解,但是赛后看了一个大佬的代码利用递归写的,刚好我的递归理解的一般所以就拿来学习一下,我们可以将问题转化为两个部分进行求解,括号内部和外部,这样递归的思路就有了,我们将括号内部看成一个整体利用外部的规则对内部进行分子质量的计算,然后在加到整体上面去,这样就可以完成对于全局的求解。看到这里如果大家没理解,我这里直接附上AC的代码分析:
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
#define int ll
const int N = 100010 ;
string s ;
int i,len;
int work(){//该函数相当于求解整外部分子质量的函数
int t = 0 , ans = 0 ;
for( ; i < len ; i ++){
int num = 0 ;
while(s[i]>='0'&&s[i]<='9') {num = num * 10 + (s[i++] - '0');}
//这个while循环用来计算某个整体或者单个原子的个数
t = t * (num ? num : 1);
//这里就是对原子个数进行处理如果为0就赋值为1
ans += t ;
//这里将整体的原子质量加到最终结果里面去
t = 0 ;
if(s[i] == 'C'){
t = 13 ;
}else if(s[i] == 'H'){
t = 1 ;
}else if(s[i] == 'O'){
t = 17 ;
}else if(s[i] == '('){
i++;
t = work();
//这里可以说是整个代码的核心部分,这里是对于括号内部进行局部求解,利用外部·求解的规则
}else{
break;
//这里就是遇到右括号我们就结束了局部的求解退出该循环
}
}
ans += t ;
//最后将局部救出的结果赋值给ans进行返回赋值给t变量
return ans ;
}
int main(){
cin >> s ;
len = s.length();
cout << work() << endl;
}
通过这道题确实加深了对于递归的理解,继续加油!!!