题解:P8035 [COCI2015-2016#7] Otpor

Tomwsc

2024-11-18 21:13:11

Solution

本题解主要为还没学物理的 OIer 们提供。

前言:

做前须知:

1.欧姆定律:

介绍一下公式:I=\frac{U}{R}。即电流等于电压与电阻之比。

所以,可以得到推导式:R=\frac{U}{I}

2.等效电阻

定义:几个连接起来的电阻所起的作用,可以用一个电阻来代替,这个电阻就是那些电阻的等效电阻。

1.串联电路中的等效电阻:

由串联电路中的电流处处相等,各用电器电压之和等于电源电压(等流分压)得:

R_总=\frac{U_总}{I_总}=\frac{U_1+U_2+\cdots+U_n}{I}=\frac{U_1}{I}+\frac{U_2}{I}+\cdots+\frac{U_n}{I}=R_1+R_2+\cdots+R_n

所以,串联电路中的等效电阻便等于各用电器电阻之和。

2.并联电路中的等效电阻:

由并联电路中的各支路电流之和等于干路电流,电压处处相等(等压分流)得:

R_总=\frac{U_总}{I_总}=\frac{U}{I_1+I_2+\cdots+I_n}

此时,不难想到对 R_总 取一个倒数,即:\frac{1}{R_总}=\frac{I_1+I_2+\cdots+I_n}{U}=\frac{1}{R_1}+\frac{1}{R_2}+\cdots+\frac{1}{R_n}

所以,并联电路中的等效电阻等于各用电器电阻的倒数的和的倒数。(有点绕,可以尝试理解一下)。

题意:

给定用电器的个数以及各用电器的电阻值以及一个表示串连或并连的式子,让你求此电路的等效电阻。

思路与代码实现:

对于这样子的式子,很容易令人想到用栈来模拟。(于是 5 分钟切了)。

我们可以开两个栈,一个记录电阻值,一个记录括号与符号。遇到 ) 就一直 pop到出现 ( 的时候,中间不断在记录电阻值的栈中计算值即可。

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 10;
int n;
double r[MAXN];
string s;
stack<char>st;  //存符号 
stack<double>sn;    //存数字 

signed main() {
    cin >> n;
    for(register int i = 1;i <= n;i ++)
        cin >> r[i];
    cin >> s;
    for(register int i = 0;i < s.length();i ++) {
        if(s[i] == '(')
            st.push('(');
        if(s[i] == 'R')
            sn.push(r[s[i + 1] - '0']);
        if(s[i] == '-')
            st.push('-');
        if(s[i] == '|')
            st.push('|');
        if(s[i] == ')') {
            while(st.top() != '(') {
                if(st.top() == '-') {
                    double a = sn.top();
                    sn.pop();
                    double b = sn.top();
                    sn.pop();
                    sn.push(a + b);
                }
                if(st.top() == '|') {
                    double a = sn.top();
                    sn.pop();
                    double b = sn.top();
                    sn.pop();
                    sn.push(1 / (1 / a + 1 / b));
                }
                st.pop();
            }
            st.pop();
        }
    }
    cout << fixed << setprecision(5) << sn.top();
    return 0;
}