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和模数的值取得好出题人根本 ...
随机推荐
- 数据结构和算法 – 7.散列和 Hashtable 类
7.1.散列函数 散列是一种常见的存储数据的技术,按照这种方式可以非常迅速地插入和取回数据.散列所采用的数据结构被称为是散列表.尽管散列表提供了快速地插入.删除.以及取回数据的操作,但是诸如查找最大值 ...
- MVC – 3.EF(Entity Framework)
1.实体框架(EF)简介 与ADO.NET的关系 全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框 ...
- 【Python】 用python实现定时数据解析服务(前言)
一.Why do it? 背景:项目里上传上来的数据都是未解析的数据,而且数据量还算挺庞大的,每天上传的数据有5kw左右,如果用数据库自带的作业来解析的话,数据库会造成严重的阻塞.因此打算把数据读到外 ...
- 【翻译十七】java-并发之高性能对象
High Level Concurrency Objects So far, this lesson has focused on the low-level APIs that have been ...
- ArcGIS ElementLayer上放置Windows控件
ElementLayer是ArcGIS API for Silverlight/WPF中的一种图层类型,主要用来承载Silverlight/WPF中的UIElement对象(UIElement),使用 ...
- supervisor使用
supervisor是一个C/S系统,它可以在类unix操作系统让用户来监视和控制后台服务进程的数量,一个很重要的功能就是监控服务器的主要后台进程,并在出现问题是自动重启. 根据服务器上的python ...
- VS2015 Preview Secondary Installer 离线安装
VS2015 Preview Secondary Installer 离线安装 天朝的原因orz, 装过vs2015 preview 的人都懂的,第二阶段安装会失败.假公济私的研究了下VS2015,摸 ...
- html5 离线存储 worker
html5 离线存储 <!DOCTYPE html> <html manifest="cache.manifest"> <!--manifest存储- ...
- myeclipse+tomcat 工程名改名的问题 ——————完美解决方案
当建好的工程再重命名之后,发布和访问的时候都还是原来的名字,这个问题纠结了我很久,最好找到解决方法,这里分享一下,希望大家不要再受这种困惑.解决方法: 点击工程右键->properties-&g ...
- 函数fseek() 用法(转)
在阅读代码时,遇到了很早之前用过的fseek(),很久没有用了,有点陌生,写出来以便下次查阅. 函数功能是把文件指针指向文件的开头,需要包含头文件stdio.h fseek 函数名: fseek ...