等价表达式(noip2005)
3.等价表达式
【问题描述】
兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。
这个题目手算很麻烦,因为数学课代表对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是数学课代表,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
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……
【输入文件】
第一行给出的是题干中的表达式。第二行是一个整数n(2 <= n <= 26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D……
输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
【输出文件】
输出文件包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。
【样例输入】
( a + 1) ^2
3
(a-1)^2+4*a
a + 1+ a
a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a
【样例输出】
AC
【数据规模】
对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;
对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。
解析:
(1) 如果直接判断两个表达式等价比较麻烦,笔者也没想出来如何比较。但是我们可以用代数法,以不同的a值代入各式,快速排除那些结果不同的表达式,留下的便是等价的了。(注意,这里的a值最好随机生成,并且最好生成多组,这样基本能保证万无一失)。
(2)表达式求值,有两种方法,一种是中缀转后缀,然后求值;另一种就是中缀表达式直接求值,笔者喜欢第二种。
中缀表达式直接求值:
首先给表达式中所有的运算符和括号根据运算规则都规定不同的等级。根据规定的等级可以求出表达中每个运算符的等级。然后递归求解:
(1)找到级别最低的运算符opt,将表达式分成左右两部分;
(2)求opt左边的表达式的值s0;
(3)求opt左边的表达式的值s1;
(4)s0 opt s1 。
运算符的级别:
符号 |
+ - |
* / |
^ |
( |
) |
优先级 |
1 |
2 |
3 |
3 |
-3 |
{中缀表达式直接求值:给每个运算符根据运算规则制定不同的等级,运算时先找出表达式中级别最低的运算符,将表达式分成左右两部分,先求左边 再求右边,最后求整个表达式的运算结果。}
var
a:array[..] of string;
f:array[..] of boolean;
b:array[..] of integer;
e:array[..,..] of int64;
h:array[..] of integer;
n:integer;
procedure level(s:string);
var
i,len,base:integer;
begin
len:=length(s);
for i:= to len do h[i]:=maxint;
base:=;
for i:= to len do
case s[i] of
'(':inc(base,);
')':dec(base,);
'+','-':h[i]:=base+;
'*':h[i]:=base+;
'^':h[i]:=base+;
end;
end;
procedure init;
var i:integer;
begin
assign(input,'equal.in'); reset(input);
readln(a[]);
readln(n);
for i:= to n do readln(a[i]);
close(input);
end;
function data(L,r,x,t:integer):integer;
var i:longint;
begin
while (a[t][L]='(') or(a[t][L]=' ')do inc(L);
while (a[t][r]=')')or (a[t][r]=' ') do dec(r);
data:=;
if a[t][L]='a' then exit(x);
for i:=L to r do data:=data*+ord(a[t][i]) -;
end;
function find(L,r:integer):int64;
var i,min:integer;
begin
min:=maxint;
find:=;
for i:=r downto L do
if h[i]<min then begin min:=h[i];find:=i; end;
end;
function opt(u,k,v:int64;t:integer):int64;
var i:integer;
begin
case a[t][k] of
'+':opt:=u+v;
'-':opt:=u-v;
'*':opt:=u*v;
'^':begin
opt:=;
for i:= to v do opt:=opt*u;
end;
end;
end;
function work(L,r,x,i:integer):int64;
var k,u,v:int64;
begin
k:=find(L,r);
if k= then exit(data(l,r,x,i));
u:=work(L,k-,x,i);
v:=work(K+,r,x,i);
work:=opt(u,k,v,i);
end;
procedure main;
var i,j,len:integer;
bo:boolean;
begin
randomize;
for i:= to do
b[i]:=random(); for i:= to n do
begin
level(a[i]);
len:=length(a[i]);
for j:= to do e[i,j]:=work(,len,b[j],i);
if i> then
begin
bo:=true;
for j:= to do if e[i,j]<>e[,j] then bo:=false;
if bo then write(chr(+i));
end;
end;
end;
begin
assign(output,'equal.out');rewrite(output);
init;
main;
close(output);
end.
等价表达式(noip2005)的更多相关文章
- 【b504】等价表达式(NOIP2005第4题)
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数 ...
- 数据结构--栈 codevs 1107 等价表达式
codevs 1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Descripti ...
- 洛谷 P1054 等价表达式 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷P1054 等价表达式
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 等价表达式 2005年NOIP全国联赛提高组(栈模拟)
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷 P1054 等价表达式
洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...
- NOIP2005 等价表达式
题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...
- NOIP2005 等价表达式 解题报告
明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和 ...
- [NOIP2005] 提高组 洛谷P1054 等价表达式
题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...
随机推荐
- git冲突的发生和解决/git workspace关于git的配置
分支之间的冲突时如何产生的,前提是他们之间本来没有冲突,然后一个分支git add commit,另一个分支也git add commit,并且恰好是在同一个文件,于是冲突就产生了,冲突的解决有两种: ...
- matlab中图像显示函数
image函数是显示图像的最基本的方法.该函数还产生了图像对象的句柄,并允许对对象的属性进行设置. imagesc函数也具有image的功能,所不同的是imagesc函数还自动将输入数据比例化,以全色 ...
- 20145218 《Java程序设计》课程总结
20145218 <Java程序设计>课程总结 每周读书笔记链接汇总 20145218<Java程序设计>第一周学习总结 20145218<Java程序设计>第二周 ...
- Ubuntu 下 Neo4j单机安装和集群环境安装
1. Neo4j简介 Neo4j是一个用Java实现的.高性能的.NoSQL图形数据库.Neo4j 使用图(graph)相关的概念来描述数据模型,通过图中的节点和节点的关系来建模.Neo4j完全兼容A ...
- uva---(11549)CALCULATOR CONUNDRUM
Problem C CALCULATOR CONUNDRUM Alice got a hold of an old calculator that can display n digits. She ...
- java(课程设计之记事本界面部分代码公布)
代码:涉及记事本的一些界面......!! /* *java课程设计之记事本(coder @Gxjun) * 编写一个记事本程序 * 要求: * 用图形用户界面实现. * 能实现编辑.保存.另存为.查 ...
- Web总结
Web总结 学习web前端理论基础必然是要过关的,这里我总结了一下比较基础的常用理论,还是比较有用哒! 一.名词解释 1.横切 在固定页面的宽度(按栅格化进行)并且对高度没有限制的容器称为一个标准横切 ...
- Excel VBA记录
-----------快捷键---------- 函数等提示(默认):ctrl+j 注释:上单引号' 设置单元格为空可以用:empty/null -----------基础语法--------- 基本 ...
- ExecuteNonQuery()返回值注意点
在使用ExecuteNonQuery(),调用存储过程,语句执行无错误,但是返回结果一直是-1 原因: 当使用储存过程时, 要把SET NOCOUNT ON 这个语句去掉, 这样数据就有反回值了 当 ...
- 编写自己的Windows Live Writer插件
起因 自从小猪使用Windows Live Writer(wlw)来写博客之后就很少打开网站的后台编辑器了,这真是个写博客的好东西啊,但是任何东西都是不完美的.索契冬奥会开幕式都会把五环弄成四环呢!对 ...