NOIP 2005 等价表达式 (TYVJ P1060)
做题记录: 2016-08-10 23:35:09
背景
描述
这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
1. 表达式只可能包含一个变量‘a’。
2. 表达式中出现的数都是正整数,而且都小于10000。
3. 表达式中可以包括四种运算‘+’(加),‘-’(减),‘*’(乘),‘^’(乘幂),以及小括号‘(’,‘)’。小括号的优先级最高,其次是‘^’,然后是‘*’,最后是‘+’和‘-’。‘+’和‘-’的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符‘+’,‘-’,‘*’,‘^’以及小括号‘(’,‘)’都是英文字符)
4. 幂指数只可能是1到10之间的正整数(包括1和10)。
5. 表达式内部,头部或者尾部都可能有一些多余的空格。
下面是一些合理的表达式的例子:
((a^1) ^ 2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1 + (a -1)^3,1^10^9……
对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;
对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。
输入格式
输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
输出格式
测试样例1
输入
(a+ 1)^2
3
(a -1)^ 2+4* a
a +1+ a
a^2 +2*a *1+1 ^2+ 10-10+a- a
输出
AC
代码
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 long long check,final; 7 long long num[55],op[55]; 8 string s; 9 10 long long power(long long a,long long b) 11 { 12 long long k=1; 13 for(int i=0;i<b;i++) 14 k*=a; 15 return k; 16 } 17 18 void cul(int p,int op) 19 { 20 if(op==0) num[p-1]=num[p-1]+num[p]; 21 if(op==1) num[p-1]=num[p-1]-num[p]; 22 if(op==2) num[p-1]=num[p-1]*num[p]; 23 // if(op==3) num[p-1]=num[p-1]/num[p]; 24 if(op==5) num[p-1]=power( num[p-1],num[p] ); 25 } 26 27 long long result(string str){ 28 int op_nxt;//下一个操作符 29 int len=str.length(),p=-1,q=-1;//p数字栈指针 ,q符号栈指针 30 long long num_nxt=0; 31 for(int i=0;i<len;i++){ 32 if(str[i]=='a') num[++p]=check; 33 else if(str[i]>='0'&&str[i]<='9') num_nxt=num_nxt*10+(str[i]-'0'); 34 else if(str[i]!=' '){ 35 if(num_nxt!=0){ 36 num[++p]=num_nxt; 37 num_nxt=0; 38 } 39 if(str[i]=='+') op_nxt=0; 40 if(str[i]=='-') op_nxt=1; 41 if(str[i]=='*') op_nxt=2; 42 // if(str[i]=='/') op_nxt=3; 43 if(str[i]=='^') op_nxt=5; 44 if(str[i]=='(') op_nxt=6; 45 if(str[i]==')') op_nxt=7; 46 if(op_nxt==6) op[++q]=op_nxt; 47 else if(op_nxt==7) while(q>=0&&op[q--]!=6) cul(p--,op[q+1]); 48 else { 49 while(q>=0&&op[q]<=5&&op[q]/2>=op_nxt/2) cul(p--,op[q--]); 50 op[++q]=op_nxt; 51 } 52 } 53 } 54 //清空堆栈 55 if(num_nxt!=0){ 56 num[++p]=num_nxt; 57 num_nxt=0; 58 } 59 while(q>=0) cul(p--,op[q--]); 60 return num[0]; 61 } 62 63 int main(){ 64 freopen("01.txt","r",stdin); 65 string str1,str2; 66 int n; 67 final=0; 68 getline(cin,str1); 69 cin>>n; 70 getline(cin,str2); 71 while(n--) 72 { 73 bool flag=true; 74 getline(cin,str2); 75 for (int i=10;i<=20;i++) 76 { 77 check=i; 78 if (result(str1)!=result(str2)) 79 { 80 flag=false; 81 break; 82 } 83 } 84 if (flag) cout<<(char)('A'+final); 85 final++; 86 } 87 cout<<endl; 88 return 0; 89 }
这题写了我老半天了,中间还睡着了好几次,非常困惑啊。
这题范围比较小,long long integer直接能过,像下面给出的其中一道题目就需要高精度。(假装我写了的样子~)
顺便附同类题目链接(TYVJ):
http://www.tyvj.cn/p/1043
http://www.tyvj.cn/Solution/8759
基本功还是要好好练练,为了提升代码阅读能力,仅给出主要注释。
表达式系列问题解答:
http://www.cnblogs.com/radiumlrb/p/5778357.html
转载于:https://www.cnblogs.com/radiumlrb/p/5759319.html
NOIP 2005 等价表达式 (TYVJ P1060)相关推荐
- 数据结构--栈 codevs 1107 等价表达式
codevs 1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 明 ...
- 洛谷 P1054 等价表达式
洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...
- vijos-1003等价表达式
明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和 ...
- NOIP 2005 过河
描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上 ...
- NOIP 2005 篝火晚会
题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n ...
- [NOIP 2005 T2] 过河 (动态规划+简单数论)
题目大意:一只青蛙要从数轴原点向右跳过L(L<=10^9)的距离,在(0,L)上存在m个位于整点位置的石头(m<=100),青蛙每次跳跃可以向右跳[s,t](1<=s<=t&l ...
- NOIP复赛复习(一)常见问题与常用策略
数学类问题 1. 精度处理(高精度.实数处理.各种浮点类型处理方法) 2. 组合数学问题(斐波那契数列.第二类数.卡特兰数.Polya原理.排列组合计数.加法原理与乘法原理) 3. 进制问题(特定二进 ...
- NOIP大纲整理:(零)历年2000-2016NOIP提高组题目分析
年份 题目名称 考查内容 难度 2000-2016年NOIP提高组复赛题目 2000-A 进制转换 初等代数,找规律 ★ 2000-B 乘积最大 资源分配DP ★★★ 2000-C 单词接龙 DF ...
- NOIp系列题目及CF小结
长期更新中2333 2018/7/2 先看一下昨晚的cf Codeforces Round #493 (Div. 2) A. Balloons 这个题...直接模拟233 B. Cutting 来一下 ...
- 前缀 中缀 后缀表达式2
对于未经训练的用户来说,计算机科学领域中数学表达式求值的传统方法即不顺手又难以使用:软件工程师 Nikola.Stepan 旨在改变这些传统方法.他的 applet W3Eval 对表达式求值与您用纸 ...
最新文章
- 基于OpenCV实战的图像处理:色度分割
- shell逐行读取文件
- hadoop yarn配置任务优先级
- linux系统的4个部分,以下是Linux文件系统的4个相关的结构定义中的一部分: Struct i..._考试资料网...
- 英语学习笔记2019-11-15
- RabbitMQ工作模式Publish/Subscribe发布订阅,test测试代码
- D3D学习摘记(I)上
- 以弹窗形式打开页面_“弹窗广告”肆意而为!扰民?还可能侵权!
- 在校开发的装柜辅助系统
- starting mysql error_Starting MySQL.. ERROR! The server quit without updating PID file
- wand(wead and)算法简介与改造,修改为店铺与品牌的关键字搜索
- Android游戏开发---碰撞检测
- 麒麟合盛(APUS)李涛:APUS云重新定义“云联邦”
- 记录四川移动盒子打开adb命令的方法 型号:UNT401H
- 安卓WebView的那些坑
- 智能代还行业怎么样?合法吗?代还APP开发靠谱吗?
- vue移动端项目经验
- 你真的了解什么是Beta测试?完整测试指南
- 程序员狂怒:薪水被应届生倒挂了,很不爽,天王老子也别想留住我!
- java判断图中两点是否连通_连通分量(求有几个连通分量+判断是否两点连通+是否为强联通图 相应例子)...
热门文章
- pycharm 无法安装模块 nothing to show
- MVC案例之删除以及其中遇到的问题,附源代码
- mysql恢复备份快照_MySQL备份恢复:磁盘LVM快照
- python中popen阻塞怎么办_对Python subprocess.Popen子进程管道阻塞详解
- 并查集路径压缩_并查集专题
- 估计理论(2):Cramer-Rao下限
- 最大似然估计和最大后验估计
- 【2018 SWERC - C 】Crosswords【字典树、暴力搜索】
- 51.N皇后 (力扣leetcode) 博主可答疑该问题
- originos是鸿蒙系统吗,originos系统是安卓吗