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
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
long long check,final;
long long num[],op[];
string s; long long power(long long a,long long b)
{
long long k=;
for(int i=;i<b;i++)
k*=a;
return k;
} void cul(int p,int op)
{
if(op==) num[p-]=num[p-]+num[p];
if(op==) num[p-]=num[p-]-num[p];
if(op==) num[p-]=num[p-]*num[p];
// if(op==3) num[p-1]=num[p-1]/num[p];
if(op==) num[p-]=power( num[p-],num[p] );
} long long result(string str){
int op_nxt;//下一个操作符
int len=str.length(),p=-,q=-;//p数字栈指针 ,q符号栈指针
long long num_nxt=;
for(int i=;i<len;i++){
if(str[i]=='a') num[++p]=check;
else if(str[i]>=''&&str[i]<='') num_nxt=num_nxt*+(str[i]-'');
else if(str[i]!=' '){
if(num_nxt!=){
num[++p]=num_nxt;
num_nxt=;
}
if(str[i]=='+') op_nxt=;
if(str[i]=='-') op_nxt=;
if(str[i]=='*') op_nxt=;
// if(str[i]=='/') op_nxt=3;
if(str[i]=='^') op_nxt=;
if(str[i]=='(') op_nxt=;
if(str[i]==')') op_nxt=;
if(op_nxt==) op[++q]=op_nxt;
else if(op_nxt==) while(q>=&&op[q--]!=) cul(p--,op[q+]);
else {
while(q>=&&op[q]<=&&op[q]/>=op_nxt/) cul(p--,op[q--]);
op[++q]=op_nxt;
}
}
}
//清空堆栈
if(num_nxt!=){
num[++p]=num_nxt;
num_nxt=;
}
while(q>=) cul(p--,op[q--]);
return num[];
} int main(){
freopen("01.txt","r",stdin);
string str1,str2;
int n;
final=;
getline(cin,str1);
cin>>n;
getline(cin,str2);
while(n--)
{
bool flag=true;
getline(cin,str2);
for (int i=;i<=;i++)
{
check=i;
if (result(str1)!=result(str2))
{
flag=false;
break;
}
}
if (flag) cout<<(char)('A'+final);
final++;
}
cout<<endl;
return ;
}
这题写了我老半天了,中间还睡着了好几次,非常困惑啊。
这题范围比较小,long long integer直接能过,像下面给出的其中一道题目就需要高精度。(假装我写了的样子~)
顺便附同类题目链接(TYVJ):
http://www.tyvj.cn/Solution/8759
基本功还是要好好练练,为了提升代码阅读能力,仅给出主要注释。
表达式系列问题解答:
http://www.cnblogs.com/radiumlrb/p/5778357.html
NOIP 2005 等价表达式 (TYVJ P1060)的更多相关文章
- NOIP 2005 等价表达式 题解
题意 给一个表达式然后再给n个表达式,判断是否等价 一道大模拟题,将a带为数,并且取模防止溢出 #include<bits/stdc++.h> using namespace std; c ...
- noip 2005 等价表达式
/* 开始想的是 维护a的每个指数的系数 然而不好办 然而还有^10^10^10这种数据 特殊值带入吧 多搞几个素数 接下来就是玄学的事了 给a赋值之后 就是简单地表达式求值 虽然思路简单 但是字符串 ...
- 等价表达式 2005年NOIP全国联赛提高组(栈模拟)
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 数据结构--栈 codevs 1107 等价表达式
codevs 1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Descripti ...
- 洛谷P1054 等价表达式
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 等价表达式(noip2005)
3.等价表达式 [问题描述] 兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也 ...
- 洛谷 P1054 等价表达式 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷 P1054 等价表达式
洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...
- 【Tyvj 1060】【NOIP 2005】等价表达式
设a为一个质数,模数为另一个质数,然后暴力算多项式的答案,如果答案相等就认为两个多项式相等. 这种hash有出错概率的题为什么还是要用hash呢?因为出错的概率实在太小了,a和模数的值取得好出题人根本 ...
随机推荐
- SQLServer事务
指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)由多个sql语句组成,必须作为一个整体执行这些sql语句作为一个整体一起向系统提交,要么都执行.要么都不执行 语法步骤:开始事务:BEG ...
- Pyqt 以OOP方式动画的效果改变自身窗体大小
代码: # -*- coding:utf8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys class ani( ...
- 网站性能测试工具--MS Web Application Stress Tool
MS Web Applicaion Stress Tool 是一款网页测试的性能工具,具体的使用可以参考下面这篇博客文章 http://cuisuqiang.iteye.com/blog/193640 ...
- Android:dimen尺寸资源文件的使用(转)
为了适配不同的分辨率. dimen.xml在values文件夹下面 <resources> <!-- Default screen margins, per the Android ...
- C++读取文件夹中所有的文件或者是特定后缀的文件
由于经常有读取一个文件夹中的很多随机编号的文件,很多时候需要读取某些特定格式的所有文件. 下面的代码可以读取指定文件家中的所有文件和文件夹中格式为jpg的文件 参考: http://www.2cto. ...
- Redis主从自动failover
Redis主从架构持久化存在一个问题,即前次测试的结论,持久化需要配置在主实例上才能跨越实例保证数据不丢失,这样以来主实例在持久化数据到硬 盘的过程中,势必会造成磁盘的I/O等待,经过实际测试,这个持 ...
- URL编码表%20Base64编码表%20HTTP消息含义
URL编码表 backspace 8% A 41% a 61% § %A7 Õ %D5 tab 9% B 42% b 62% « %AB Ö %D6 linefeed %0A C 43% c ...
- adb server is out of date. killing解决方法
adb server is out of date. killing完美解决 今天,久未出现的著名的“adb server is out of date. killing”又发生了,在此,将解决方 ...
- [HTTP那些事]网络请求API
在Android上,原生API有两个,HttpUrlConnection和HttpClient,它们对封装Socket进行封装,让HTTP请求变得简单.这应该也算框架吧? 想象下,如果没有HttpUr ...
- HDU 4858 项目管理 分块
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4858 题解: 下面说一个插入查询时间复杂度为sqrt(m)的算法: 对每个点定义两个值:val,su ...