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和模数的值取得好出题人根本 ...
随机推荐
- eclipse 创建项目时出现appcompat_v7?
建项目时不出现appcompat_v7包的方法.既然appcompat_v7包是一个能让2.1以上全使用上4.0版本的界面的支持库,那么如图所示,我们建项目时直接把最小SDK选在Android4.0以 ...
- 11g 使用rman duplicate复制数据库,创建辅助实例
一,创建所需目录 1)创建审计文件目录 PROD1@dbrac1 /dsg/oracle11$ cd $ORACLE_BASE/admin PROD1@dbrac1 /u01/app/oracle/a ...
- 使用pl/sql監控PROCEDURE執行時間
創建表 CREATE TABLE PROCESS_TIMING_LOG ( PROCESS_NAME VARCHAR2(50 BYTE), EXECUTION_DATE D ...
- WCF消息拦截,利用消息拦截做身份验证服务
本文参考 http://blog.csdn.net/tcjiaan/article/details/8274493 博客而写 添加对信息处理的类 /// <summary> /// 消 ...
- php几个常用的概率算法(抽奖、广告首选)
做网站类的有时会弄个活动什么的,来让用户参加,既吸引用户注册,又提高网站的用户活跃度.同时参加的用户会获得一定的奖品,有100%中奖的,也有按一定概率中奖的,大的比如中个ipad.iphone5,小的 ...
- 源码方式安装mysql5.5
mysql5.5开始,源码配置编译工具configure变成了cmake,所以先要去把cmake装上.并安装make,bison,cmake,gcc-c++,ncurses的包 去http://www ...
- PAT A 1004. Counting Leaves (30)【vector+dfs】
题目链接:https://www.patest.cn/contests/pat-a-practise/1004 大意:输出按层次输出每层无孩子结点的个数 思路:vector存储结点,dfs遍历 #in ...
- "Project facet Java version 1.7 is not supported"的问题解决的办法
问题描述 在eclipse中,从SVN中检出project代码,拖拽式部署到local server中的时候,报出以下错误: 问题分析 问题产生的原因是,SVN中的代码是采用java 1.7开发编译的 ...
- T-SQL优化
我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我么还能保证下一段时间系统还能流畅的运行吗?我么还 ...
- SQLServer 维护脚本分享(05)内存(Memory)
--查看设置的最大最小每次 exec sp_configure 'max server memory (MB)' exec sp_configure 'min server memory (MB)' ...