做题记录: 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[],op[];
  8. string s;
  9.  
  10. long long power(long long a,long long b)
  11. {
  12. long long k=;
  13. for(int i=;i<b;i++)
  14. k*=a;
  15. return k;
  16. }
  17.  
  18. void cul(int p,int op)
  19. {
  20. if(op==) num[p-]=num[p-]+num[p];
  21. if(op==) num[p-]=num[p-]-num[p];
  22. if(op==) num[p-]=num[p-]*num[p];
  23. // if(op==3) num[p-1]=num[p-1]/num[p];
  24. if(op==) num[p-]=power( num[p-],num[p] );
  25. }
  26.  
  27. long long result(string str){
  28. int op_nxt;//下一个操作符
  29. int len=str.length(),p=-,q=-;//p数字栈指针 ,q符号栈指针
  30. long long num_nxt=;
  31. for(int i=;i<len;i++){
  32. if(str[i]=='a') num[++p]=check;
  33. else if(str[i]>=''&&str[i]<='') num_nxt=num_nxt*+(str[i]-'');
  34. else if(str[i]!=' '){
  35. if(num_nxt!=){
  36. num[++p]=num_nxt;
  37. num_nxt=;
  38. }
  39. if(str[i]=='+') op_nxt=;
  40. if(str[i]=='-') op_nxt=;
  41. if(str[i]=='*') op_nxt=;
  42. // if(str[i]=='/') op_nxt=3;
  43. if(str[i]=='^') op_nxt=;
  44. if(str[i]=='(') op_nxt=;
  45. if(str[i]==')') op_nxt=;
  46. if(op_nxt==) op[++q]=op_nxt;
  47. else if(op_nxt==) while(q>=&&op[q--]!=) cul(p--,op[q+]);
  48. else {
  49. while(q>=&&op[q]<=&&op[q]/>=op_nxt/) cul(p--,op[q--]);
  50. op[++q]=op_nxt;
  51. }
  52. }
  53. }
  54. //清空堆栈
  55. if(num_nxt!=){
  56. num[++p]=num_nxt;
  57. num_nxt=;
  58. }
  59. while(q>=) cul(p--,op[q--]);
  60. return num[];
  61. }
  62.  
  63. int main(){
  64. freopen("01.txt","r",stdin);
  65. string str1,str2;
  66. int n;
  67. final=;
  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=;i<=;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 ;
  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

NOIP 2005 等价表达式 (TYVJ P1060)的更多相关文章

  1. NOIP 2005 等价表达式 题解

    题意 给一个表达式然后再给n个表达式,判断是否等价 一道大模拟题,将a带为数,并且取模防止溢出 #include<bits/stdc++.h> using namespace std; c ...

  2. noip 2005 等价表达式

    /* 开始想的是 维护a的每个指数的系数 然而不好办 然而还有^10^10^10这种数据 特殊值带入吧 多搞几个素数 接下来就是玄学的事了 给a赋值之后 就是简单地表达式求值 虽然思路简单 但是字符串 ...

  3. 等价表达式 2005年NOIP全国联赛提高组(栈模拟)

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

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

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

  5. 洛谷P1054 等价表达式

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

  6. 等价表达式(noip2005)

    3.等价表达式 [问题描述]    兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也 ...

  7. 洛谷 P1054 等价表达式 解题报告

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

  8. 洛谷 P1054 等价表达式

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

  9. 【Tyvj 1060】【NOIP 2005】等价表达式

    设a为一个质数,模数为另一个质数,然后暴力算多项式的答案,如果答案相等就认为两个多项式相等. 这种hash有出错概率的题为什么还是要用hash呢?因为出错的概率实在太小了,a和模数的值取得好出题人根本 ...

随机推荐

  1. EF – 3.EF数据查询基础(下)数据关联

    5.5.1 <关于“数据关联”,你不一定清楚的事> 这讲视频比较全面地介绍了“一对一”.“一对多”和“多对多”三种数据关联类型在关系数据库和Entity Framework数据模型中的实现 ...

  2. Redis笔记(七)Java实现Redis消息队列

    这里我使用Redis的发布.订阅功能实现简单的消息队列,基本的命令有publish.subscribe等. 在Jedis中,有对应的java方法,但是只能发布字符串消息.为了传输对象,需要将对象进行序 ...

  3. MVC基础知识

    1.View中获取Control和View: //获取控制器名称: ViewContext.RouteData.Values["controller"].ToString(); / ...

  4. oracle 11g r1 RAC增加新节点

    在一套两节点的rac上增加一个新的节点,详细的操作记录如下:   已有节点RAC1,RAC2 一,环境及版本: 公司环境:Vmware Esxi 5.5  操作系统:Redhat 5.8 x86_64 ...

  5. 攻城狮在路上(贰) Spring(三)--- Spring 资源访问利器Resource接口

    Spring为了更好的满足各种底层资源的访问需求.设计了一个Resource接口,提供了更强的访问底层资源的能力.Spring框架使用Resource装载各种资源,包括配置文件资源.国际化属性文件资源 ...

  6. wp8 入门到精通 ---转换

             /// <summary>        /// 颜色字符串转Color        /// </summary>        public static ...

  7. Windows Phone中获取UserAgent

    进入WP8时代后,通过DeviceExtendedProperties获取到的DeviceName不再是手机型号了,这对于需要获得手机型号做一些事情的应用(如新浪微博的小尾巴)来说,影响是比较大的. ...

  8. 封装自己的printf函数

    #include <stdio.h> #include <stdarg.h> //方式一 #define DBG_PRINT (printf("%s:%u %s:%s ...

  9. HDU 5876 Sparse Graph BFS 最短路

    Sparse Graph Problem Description   In graph theory, the complement of a graph G is a graph H on the ...

  10. windows下R语言在终端的运行

    在windows下可以有多种方式来运行R,R导论的这些章节给出一些详细的指导. 通常在环境变量离包含R的安装目录类似于R\R-3.1.2\bin\x64的情况下,就可以在CMD下运行R程序了 注意我这 ...