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,最后使流量平衡 解析: ...
随机推荐
- 深入浅出KNN算法(一) KNN算法原理
一.KNN算法概述 KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学 ...
- 线上centos6出现软死锁 kernel:BUG: soft lockup
线上centos6出现软死锁 kernel:BUG: soft lockup 今天线上一台centos6机器用xshell一直连接不上,然后在xshell上显示 Message from syslog ...
- C#隐式转换与显示转换
System.Objec时C#中所有类型的基类,也就是万类之源. 一.值类型 值类型都继承自System.ValueType(派生自System.Objec),继承自System.ValueType的 ...
- C#几个经常用到的字符串的截取
string str="123abc456";int i=3;1 取字符串的前i个字符 str=str.Substring(0,i); // or str=str.Remov ...
- Java基础系列--04_数组
一维数组: (1)数组:存储同一种数据类型的多个元素的容器. (2)特点:每一个元素都有编号,从0开始,最大编号是数组的长度-1. 编号的专业叫法:索引 (3)定义格式 A:数据类型[] 数组名;(一 ...
- Mysql 字符串指定位置插入空格
UPDATE flow_data_243 SET data_15=CONCAT(LEFT(data_15,10),' ',RIGHT(data_15,LENGTH(data_15)-10)) WHER ...
- Django学习笔记(1)--第一个项目
操作系统:Windows Python版本:python3.6 前置工作: pip install virtualenvwrapper #安装虚拟环境管理包 1.创建虚拟环境 mkvirtualenv ...
- 记录nodejs的writeHead
使用response.writeHead()时,如果第二个参数的值使用错误的字符时,会使整个页面被镶嵌在<pre></pre>中被传输过去. 例: response.write ...
- 关于spring boot中 EmbeddedServletContainerCustomizer
EmbeddedServletContainerCustomizer这个在spring boot2.X的版本中就不再提供支持了貌似2.0版本还能用 ,用来提供对异常的处理.在支持EmbeddedSer ...
- 使用栈实现队列(2)(Java)
class MyQueue { private Stack s1; private Stack s2; public MyQueue(int size) { this.s1 = new Stack(s ...