等价表达式(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 等价表达式
题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...
随机推荐
- armp启动
1.启动apahcehttpd.exe -k starthttpd.exe -k restart 重启httpd.exe -k install 安装 2.php启动apache.conf文件添加:Lo ...
- controller 监控Unix性能信息
linux系统需要有RPC(Remote Procedure Call Protocol),远程过程调用协议,通过安装rpc.rstatd程序,启动其服务,就可以给远程机器提供信息,即Lr可以获取到该 ...
- jmeter笔记7
一.脚本录制(Jmeter): Jmeter 脚本(.jmx)为 xml 格式,树形结构,由元件组成,使用“取样器”产生请求. 在“工作台”添加“HTTP 代理服务器” 端口: 代理服务器的端口,默认 ...
- WebService是什么
Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力. 其实WebService并不是什么神秘的东西,它就是一个可以远程调用的类,或者说是组件. 为什么要使用Web ...
- VS2012外接程序VMDebugger未能加载或导致了异常
转http://blog.csdn.net/maryhuan/article/details/42676915 故障现象:打开Visual Studio 2010后弹出错误框,外接程序VMDebugg ...
- 你不知道的JavaScript--面向对象高级程序设计
转载http://blog.csdn.net/i10630226/article/details/51088841 1. JS是基于原型的程序 建立一个简单的面向对象的类.有属性,有方法. funct ...
- CSS垂直居中对齐
用CSS有多种方法实现垂直居中对齐.如果已知外部div的高度,不管是否知道内部div的高度,垂直居中实现起来很简单,但如果内部div高度是变量,如文字,垂直居中实现起来就比较复杂了,很可能需要使用ha ...
- easyui numberbox不可编辑
今天又遇到了给easyui中numberbox设置不可编辑的功能,在(http://www.jeasyuicn.com/api/docTtml/index.htm)API中找到了一个方法:
- FaceBook Twitter实习生简历求内推
写在博客里面吧. 有一个朋友,男,博士在读,研究方向为图像处理,计算机视觉相关. 想在在读期间有一些海外实习经历.不知道哪位博友,有相关的人脉,求内推啊.内推成功的话请吃大餐,哈哈!
- async 和await
这个是.NET 4.5的特性,所以要求最低.NET版本为4.5. 看很多朋友还是使用的Thread来使用异步多线程操作,基本上看不见有使用Async.Await进行异步编程的.各有所爱吧,其实都可以. ...