隐藏
「bsoj5183」物理 - 表达式树/栈 | Bill Yang's Blog

路终会有尽头,但视野总能看到更远的地方。

0%

「bsoj5183」物理 - 表达式树/栈

题目大意



题目分析

去掉括号转成表达式树递归处理。
也可以用表达式栈。


代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;

inline const int Get_Int() {
int num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9') {
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9') {
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}

double n,a[15];

double Cal(string s) {
double last=0,ans=0;
int bj=0;
if(s.length()==2&&s[0]=='R')return a[s[1]-'0'];
for(int i=0; i<s.length(); i++) {
if(s[i]=='(') {
int sum=1;
for(int j=i+1; j<s.length(); j++) {
if(s[j]=='(')sum++;
if(s[j]==')')sum--;
if(sum==0) {
last=Cal(s.substr(i+1,j-i-1));
i=j;
break;
}
}
} else if(s[i]=='R') {
last=a[s[i+1]-'0'];
i++;
} else if(s[i]=='-') {
bj=1;
ans+=last;
} else if(s[i]=='|') {
bj=2;
ans+=1/last;
}
}
if(bj==1)return ans+last;
else if(bj==2) return 1/(ans+1/last);
else return last;
}

int main() {
n=Get_Int();
for(int i=1; i<=n; i++)scanf("%lf",&a[i]);
char s[505];
scanf("%s",s);
printf("%0.5lf\n",Cal(s));
return 0;
}
姥爷们赏瓶冰阔落吧~