做题记录: 2016-08-10 23:35:09

背景

NOIP2005 提高组 第四道

描述

明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。

  这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?

  这个选择题中的每个表达式都满足下面的性质:

  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%的数据,表达式中只可能出现两种运算符‘+’和‘-’;

对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。

对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。

输入格式

输入的第一行给出的是题干中的表达式。第二行是一个整数n(2 <= n <= 26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D……

  输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。

输出格式

输出包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。 

测试样例1

输入

(a+ 1)^2 

(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)相关推荐

  1. 数据结构--栈 codevs 1107 等价表达式

    codevs 1107 等价表达式 2005年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 明 ...

  2. 洛谷 P1054 等价表达式

    洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...

  3. vijos-1003等价表达式

    明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和 ...

  4. NOIP 2005 过河

    描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上 ...

  5. NOIP 2005 篝火晚会

    题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n ...

  6. [NOIP 2005 T2] 过河 (动态规划+简单数论)

    题目大意:一只青蛙要从数轴原点向右跳过L(L<=10^9)的距离,在(0,L)上存在m个位于整点位置的石头(m<=100),青蛙每次跳跃可以向右跳[s,t](1<=s<=t&l ...

  7. NOIP复赛复习(一)常见问题与常用策略

    数学类问题 1. 精度处理(高精度.实数处理.各种浮点类型处理方法) 2. 组合数学问题(斐波那契数列.第二类数.卡特兰数.Polya原理.排列组合计数.加法原理与乘法原理) 3. 进制问题(特定二进 ...

  8. NOIP大纲整理:(零)历年2000-2016NOIP提高组题目分析

    年份 题目名称 考查内容 难度   2000-2016年NOIP提高组复赛题目 2000-A 进制转换 初等代数,找规律 ★ 2000-B 乘积最大 资源分配DP ★★★ 2000-C 单词接龙 DF ...

  9. NOIp系列题目及CF小结

    长期更新中2333 2018/7/2 先看一下昨晚的cf Codeforces Round #493 (Div. 2) A. Balloons 这个题...直接模拟233 B. Cutting 来一下 ...

  10. 前缀 中缀 后缀表达式2

    对于未经训练的用户来说,计算机科学领域中数学表达式求值的传统方法即不顺手又难以使用:软件工程师 Nikola.Stepan 旨在改变这些传统方法.他的 applet W3Eval 对表达式求值与您用纸 ...

最新文章

  1. 基于OpenCV实战的图像处理:色度分割
  2. shell逐行读取文件
  3. hadoop yarn配置任务优先级
  4. linux系统的4个部分,以下是Linux文件系统的4个相关的结构定义中的一部分: Struct i..._考试资料网...
  5. 英语学习笔记2019-11-15
  6. RabbitMQ工作模式Publish/Subscribe发布订阅,test测试代码
  7. D3D学习摘记(I)上
  8. 以弹窗形式打开页面_“弹窗广告”肆意而为!扰民?还可能侵权!
  9. 在校开发的装柜辅助系统
  10. starting mysql error_Starting MySQL.. ERROR! The server quit without updating PID file
  11. wand(wead and)算法简介与改造,修改为店铺与品牌的关键字搜索
  12. Android游戏开发---碰撞检测
  13. 麒麟合盛(APUS)李涛:APUS云重新定义“云联邦”
  14. 记录四川移动盒子打开adb命令的方法 型号:UNT401H
  15. 安卓WebView的那些坑
  16. 智能代还行业怎么样?合法吗?代还APP开发靠谱吗?
  17. vue移动端项目经验
  18. 你真的了解什么是Beta测试?完整测试指南
  19. 程序员狂怒:薪水被应届生倒挂了,很不爽,天王老子也别想留住我!
  20. java判断图中两点是否连通_连通分量(求有几个连通分量+判断是否两点连通+是否为强联通图 相应例子)...

热门文章

  1. pycharm 无法安装模块 nothing to show
  2. MVC案例之删除以及其中遇到的问题,附源代码
  3. mysql恢复备份快照_MySQL备份恢复:磁盘LVM快照
  4. python中popen阻塞怎么办_对Python subprocess.Popen子进程管道阻塞详解
  5. 并查集路径压缩_并查集专题
  6. 估计理论(2):Cramer-Rao下限
  7. 最大似然估计和最大后验估计
  8. 【2018 SWERC - C 】Crosswords【字典树、暴力搜索】
  9. 51.N皇后 (力扣leetcode) 博主可答疑该问题
  10. originos是鸿蒙系统吗,originos系统是安卓吗