ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
https://nanti.jisuanke.com/t/31443
题意
给出一个表达式,求最小值和最大值。
表达式中的运算符只有'+'、'-'、'*'、'd',xdy 表示一个 y 面的骰子 roll x 次的和,其中x>=0,y>=1,实际上它的最小值就是x,小于0时要强制变为0,最大值就是 x*y ,题目给的表达式保证运算都是合法的,并且中间过程和结果都是int范围内。
分析
表达式求值,多了一个d运算,维护最大最小值,在乘法的时候取所有极值的情况。
中序表达式->后序表达式(左->右):
数字:直接输出
运算符:将栈中所有优先级>=自己的运算符输出,之后入栈(栈为空就直接入栈)
(:入栈
):将之前所有运算符输出,直到遇到 '(' ,并且将 '('也输出
最后将栈中所有东西按顺序输出
后续表达式计算(左->右):
数字:入栈
运算符:取栈顶两个数字计算,结果入栈
遍历完后栈顶元素就是答案
#include<bits/stdc++.h>
using namespace std;
struct Node{
int type;
int num;
char op;
};
map<char,int>mp;
char str[];
stack<char> s;
queue<Node> que;
void postfix(){//中缀转后缀
int len = strlen(str);
for(int i=;i<len;i++){
if(isdigit(str[i])){
int num=;
while(i<=len&&isdigit(str[i])){
num=num*+str[i]-'';
i++;
}
que.push(Node{,num,''});
}
if(i>=len) break;
if(str[i]=='(') s.push(str[i]);
else if(str[i]==')'){
while(s.top()!='('){
que.push(Node{,,s.top()});
s.pop();
}
s.pop();
}else{
while(!s.empty()&&mp[s.top()]>=mp[str[i]]){
que.push(Node{,,s.top()});
s.pop();
}
s.push(str[i]);
}
}
while(!s.empty()){
que.push(Node{,,s.top()});
s.pop();
}
}
int main(){
mp['+']=mp['-']=;
mp['/']=mp['*']=;
mp['d']=;
while(~scanf("%s",str)){
postfix();
stack<int> small,big;
while(!que.empty()){//后缀计算
Node u = que.front();que.pop();
if(u.type==) small.push(u.num),big.push(u.num);
else{
int sb = small.top(); small.pop();
int sa = small.top(); small.pop();
int bb = big.top(); big.pop();
int ba = big.top(); big.pop();
if (u.op == '+')
sa += sb, ba += bb;
else if (u.op == '-')
sa -= bb, ba -= sb;
else if (u.op == '*') {
int minn = min(min(sa*sb, sa*bb), min(ba*sb, ba*bb));
int maxx = max(max(sa*sb, sa*bb), max(ba*sb, ba*bb));
sa = minn; ba = maxx;
}
else if (u.op == 'd') {
if (sa < )sa = ;
ba *= bb;
}
small.push(sa); big.push(ba);
}
}
printf("%d %d\n", small.top(), big.top());
}
return ;
}
ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)的更多相关文章
- ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
题目链接:https://nanti.jisuanke.com/t/31443 相关前置链接 https://www.cnblogs.com/dolphin0520/p/3708602.html ht ...
- ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)
https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...
- ACM-ICPC 2018 沈阳赛区网络预赛-K:Supreme Number
Supreme Number A prime number (or a prime) is a natural number greater than 11 that cannot be formed ...
- ACM-ICPC 2018 沈阳赛区网络预赛-D:Made In Heaven(K短路+A*模板)
Made In Heaven One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. ...
- 图上两点之间的第k最短路径的长度 ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven
131072K One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. Howe ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J树分块
J. Ka Chang Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero p ...
- ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number
A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph
"Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a ...
- Fantastic Graph 2018 沈阳赛区网络预赛 F题
题意: 二分图 有k条边,我们去选择其中的几条 每选中一条那么此条边的u 和 v的度数就+1,最后使得所有点的度数都在[l, r]这个区间内 , 这就相当于 边流入1,流出1,最后使流量平衡 解析: ...
随机推荐
- 周一04.3流程控制while循环
#循环就是重复做某件事 1.条件循环:while,语法如下 while 条件: # 循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件... # 如果条件为假,那么循环体不执 ...
- 【Teradata SQL】行转列函数TDStats.udfConcat
TDstats.udfConcat为Teradata自带UDF,定义如下: show function tdstats.udfconcat; REPLACE FUNCTION tdstats.UDFC ...
- Quick Select算法
https://blog.csdn.net/Yaokai_AssultMaster/article/details/68878950 https://blog.csdn.net/mrbcy/artic ...
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- C++ 精英化趋势
精英化趋势 C++ 是一门引起无数争议的语言.眼下最常听到的声音则是 C++ 将趋于没落,会被某某语言取代.我很怀疑这种论调的起点是商业宣传,C++ 的真实趋势应该是越来越倾向于精英化. 精英化是指在 ...
- Qt class
Help on class Qt in module PyQt5.QtCore: class Qt(sip.simplewrapper) | Method resolution order: | ...
- DotNetCore 3.0 助力 WPF 开发
DotNetCore Is AnyWhere. 前言 Visual Studio 2019 已经正式发布了,DotNetCore 3.0 的正式版也指日可待.在之前的版本中,作为一名基于微软生态的传统 ...
- golang学习和使用经验总结
学习网址 https://studygolang.com/pkgdoc go标准库网站 https://blog.csdn.net/sanxiaxugang/article/details/60324 ...
- git添加秘钥提示Key is already in use
种种原因,需要修改git账号的秘钥. 操作如下: 1.删除系统上.ssh下的known_hosts文件 (一般在这个路径下C:\Users\Administrator\.ssh)如果账号不是Admi ...
- PHP用户输入数据进行过滤
1.在表单中,input项,如果用户输入的是英文状态下的双引号或单引号,数据保存后.以后又在后台编辑的时候,<input value=" "这是带引号的值,因为引号导致问题& ...