10 条题解
-
1
初稿(可忽略)
奇怪的用输入。
在里,输入,当遇到左括号
(
时,进入下一层,算完结果再return
回去。这样就可以保证括号内先算。如下图(以样例为例):
所以答案为:。
注:'⊕'符是
&
符。那么,如何算答案及回路?
用一个字符变量记录遇到的符号,输入的字符是,答案变量是。
- 当遇到符号时:
若
c == '&'
,那么fu = '&'
。 若c == '|'
,那么fu = '|'
。 - 当遇到数字时,就根据符号来更新。
关于回路,算答案时加个判断即可。
代码:
#include <bits/stdc++.h> using namespace std; int yu = 0,huo = 0;//记录与回路个数与或回路个数 int tme = 0;//debug用,记录当前下标(从1开始记) void dfs1()//跳过括号内容函数 { int k = 1;//因为不能在遇到的第一个右括号处return(讲个笑话,我就s在这了) char c;//疯狂跳过 while(cin >> c) { tme++;//下标更新 if(c == '(') k++; if(c == ')') k--; if(k == 0) return; } return; } bool dfs() { bool ans = 0; char fu = 'n';//记录符号(当前无符号) char c; while(cin >> c) { tme++;//下标++ if(c == '(')//要进入下一层dfs了 { if(fu == '&' && ans == 0) dfs1();//若有了回路了,那么跳过下一个括号全部内容(即不计算括号内回路) else if(fu == '|' && ans == 1) dfs1();//同上 else//表示前面无回路 { bool x = dfs();//计算括号内的值 if(fu == '&') ans &= x; else if(fu == '|') ans |= x;//更新答案 else ans = x;//若无符号,记得要直接赋值(讲个笑话,我又s在这儿了) } } else { if(c == ')') return ans;//若遇到右括号那么直接return(因为括号包在一起算的) else if(c == '&') { fu = '&';//更新符号 if(ans == 0) yu++;//值为0,且遇到&,回路 } else if(c == '|') { fu = '|'; if(ans == 1) huo++;//值为1,且遇到|,回路 } else if(c == '0')//若为数字,更新答案 { if(fu == '&') ans &= 0; else if(fu == '|') ans |= 0; else ans = 0; } else if(c == '1')//同上 { if(fu == '&') ans &= 1; else if(fu == '|') ans |= 1; else ans = 1; } } } return ans; } signed main() { cout << dfs(); printf("\n%d %d",yu,huo); return 0; }
这题s得有点惨
表达式树
- 当遇到符号时:
若
信息
- ID
- 2918
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 156
- 已通过
- 48
- 上传者