UVALive 2056 Lazy Math Instructor(递归处理嵌套括号)
因为这个题目说明了优先级的规定,所以可以从左到右直接运算,在处理嵌套括号的时候,可以使用递归的方法,给定每一个括号的左右边界,伪代码如下:
int Cal(){
if(括号) sum += Cal();
else sum += num;
return sum;
}
但是这个题目着实坑了我一下,见过WA了,没见过TLE呢……我因为没有看到有空格这个条件,无线TLE,又是消除函数又是改用数组模拟栈,其实就是读入出错和忘记了处理空格,改了之后,成功AC了。代码如下:
- #include<iostream>
- #include<cmath>
- #include<vector>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- #include<stack>
- using namespace std;
- #define maxn 100
- int pos[maxn],st[maxn];
- int Cal(int id,const char *a){
- int sum = ,tmp;
- for(int i = id+;i < pos[id];i++){
- if(a[i] == '('){
- tmp = Cal(i,a);
- if(a[i-]=='(' || a[i-]=='+') sum += tmp;
- else if(a[i-]=='-') sum -= tmp;
- else if(a[i-]=='*') sum *= tmp;
- i = pos[i];
- }
- else if((a[i]>='a'&&a[i]<='z')||(a[i]>=''&&a[i]<='')){
- if(a[i]>='a'&&a[i]<='z') tmp = (a[i]-'a'+);
- else tmp = a[i]-'';
- if(a[i-]=='(' || a[i-]=='+') sum += tmp;
- else if(a[i-]=='-') sum -= tmp;
- else if(a[i-]=='*') sum *= tmp;
- i++;
- }
- }
- return sum;
- }
- int getnum(const char *a){
- memset(pos,,sizeof(pos));
- memset(st,,sizeof(st));
- int len = strlen(a);
- int top = ;
- for(int i = ;i < len;i++)
- {
- if(a[i]=='(') st[top++] = i;
- if(a[i]==')') {
- pos[st[--top]] = i;
- }
- }
- int sum = ,tmp;
- for(int i = ;i < len;i++){
- if(a[i]=='('){
- tmp = Cal(i,a);
- if(i == || a[i-]=='+')
- sum += tmp;
- else if(a[i-] == '-') sum -= tmp;
- else if(a[i-] == '*') sum *= tmp;
- i = pos[i];
- }
- else if((a[i]>='a'&&a[i]<='z')||(a[i]>=''&&a[i]<='')){
- if(a[i]>='a'&&a[i]<='z') tmp = (a[i]-'a'+);
- else tmp = a[i]-'';
- if(i == || a[i-]=='+')
- sum += tmp;
- else if(a[i-] == '-') sum -= tmp;
- else sum *= tmp;
- i++;
- }
- }
- //printf("the num = %d\n",sum);
- return sum;
- }
- int main()
- {
- int t,lena,lenb,num1,num2,tot;
- char a[maxn],b[maxn];
- scanf("%d",&t);
- getchar();
- while(t--){
- gets(a);
- lena = strlen(a);
- tot = ;
- for(int i = ;i < lena;i++){
- if(a[i]==' ') continue;
- else b[tot++] = a[i];
- }
- b[tot] = '\0';
- num1 = getnum(b);
- gets(a);
- lena = strlen(a);
- tot = ;
- for(int i = ;i < lena;i++){
- if(a[i]==' ') continue;
- else b[tot++] = a[i];
- }
- b[tot] = '\0';
- num2 = getnum(b);
- if(num1 == num2) puts("YES");
- else puts("NO");
- }
- return ;
- }
UVALive 2056 Lazy Math Instructor(递归处理嵌套括号)的更多相关文章
- 数据结构——POJ 1686 Lazy Math Instructor 栈的应用
Description A math instructor is too lazy to grade a question in the exam papers in which students a ...
- POJ 1686 Lazy Math Instructor (模似题+栈的运用) 各种坑
Problem Description A math instructor is too lazy to grade a question in the exam papers in which st ...
- Lazy Math Instructor
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3721 Accepted: 1290 Description A m ...
- poj 1684 Lazy Math Instructor(字符串)
题目链接:http://poj.org/problem?id=1686 思路分析:该问题为表达式求值问题,对于字母使用浮点数替换即可,因为输入中的数字只能是单个digit. 代码如下: #includ ...
- POJ 1686 Lazy Math Instructor(栈)
原题目网址:http://poj.org/problem?id=1686 题目中文翻译: Description 数学教师懒得在考卷中给一个问题评分,因为这个问题中,学生会为所问的问题提出一个复杂的公 ...
- 递归遍历嵌套结构(多层List)中的元素 ------Python
读Python基础教程(第二版)后看到了这么一个东西,就是利用递归遍历嵌套结构中的元素. 上代码: #encoding:UTF-8 def flatten(nested): try: #不要迭代类似字 ...
- python 递归展开嵌套的序列(生成器用法)
任何使用yield语句的函数都称为生成器.调用生成器函数将创建一个对象,该对象通过连续调用next()方法(在python3中是__next__())生成结果序列. next()调用使生成器函数一直运 ...
- Python之旅Day3 文件操作 函数(递归|匿名|嵌套|高阶)函数式编程 内置方法
知识回顾 常见五大数据类型分类小结:数字.字符串.列表.元组.字典 按存值个数区分:容器类型(列表.字典.元组) 标量原子(数字.字符串) 按是否可变区分:可变(列表.字典) 不可变(数字.字符串.元 ...
- 递归、嵌套for循环、map集合方式实现树形结构菜单列表查询
有时候, 我们需要用到菜单列表,但是怎么样去实现一个菜单列表的编写呢,这是一重要的问题. 比如我们需要编写一个树形结构的菜单,那么我们可以使用JQuery的zTree插件:http://www.tre ...
随机推荐
- UVALive 6672 Bonus Cards 概率dp
题意呢 就是有两种售票方式 一种是icpc 一种是其他方式 icpc抢票成功的概率是其他方式的2倍…… 这时 一个人出现了 他通过内幕知道了两种抢票方式各有多少人 他想知道自己如果用icpc抢票成功的 ...
- 利用POI获取Excel中图片和图片位置
利用POI获取Excel中图片和图片位置(支持excel2003or2007多sheet) 转自:http://blog.csdn.net/delongcpp/article/details/8833 ...
- Hanoi汉诺塔问题——递归与函数自调用算法
题目描述 Description 有N个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱子上无盘子),但绝不允 ...
- Openjudge-计算概论(A)-求分数序列和
描述: 有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和.输入输入有一行:正整数n.输出输出有一行:分数序列的和(浮点数,精确到小数点后4位) ...
- MongoDB执行计划分析详解
要保证数据库处于高效.稳定的状态,除了良好的硬件基础.高效高可用的数据库架构.贴合业务的数据模型之外,高效的查询语句也是不可少的.那么,如何查看并判断我们的执行计划呢?我们今天就来谈论下MongoDB ...
- Value '0000-00-00' can not be represented as java.sql.Date
Value '0000-00-00' can not be represented as java.sql.Date 时间 2014-07-30 09:00:50 ITeye-博客 原文 http: ...
- arguments对象,caller 和 callee
arguments对象是比较特别的一个对象,arguments非常类似Array,但实际上又不是一个Array实例. 它指的是函数对象里的参数,且只能在函数内部使用. 使用 检测函数的参数个数,引用属 ...
- C# 获取字符的Unicode编码
using UnityEngine;using System.Collections;using System.Collections.Generic; List<); string chars ...
- 笔记整理--Linux_Socket
揭开Socket编程的面纱 - 博客 - 伯乐在线 - Google Chrome (2013/9/22 19:28:24) 揭开Socket编程的面纱 2013/09/21 | 分类: IT技术 | ...
- C语言-字符串文本串联
要形成包含多个行的字符串,可以串联两个字符串. 为此,请键入正斜杠,然后按 return 键. 反斜杠导致编译器忽略以下换行符. 例如,字符串 "Long strings can b ...