大意:给一个表达式,可以让你任意套括号,问套完括号最大最小值是多少
贪心策略:最大的话,先+后*
最小的话,先*后+
用了一个栈堆模拟运算的次序
#include<stdio.h>
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int N;
scanf("%d",&N);
for(int cases=1;cases<=N;cases++)
{
stack<unsigned long long int>S;
stack<unsigned long long int>Q;
char m;
unsigned long long int sum1=1,sum2=0,n;
scanf("%llu",&n);/*先将第一个数放入栈堆*/
S.push(n);
Q.push(n);
while((m=getchar())!='\n')
{
scanf("%llu",&n);
if(m=='*')
{
S.push(n);
n=n*Q.top();
Q.pop();
Q.push(n);
}
else if(m=='+')
{
Q.push(n);
n=n+S.top();
S.pop();
S.push(n);
}
}
while(!S.empty())
{
sum1*=S.top();
S.pop();
}
while(!Q.empty())
{
sum2+=Q.top();
Q.pop();
}
printf("The maximum and minimum are %llu and %llu.\n",sum1,sum2);
}
return 0;
}