题意:

输入一串仅仅含有+和*号的表达式,能够通过加入括号来改变表达式的值,求表达式的最大最小值。

思路:

表达式中的数都是不大于20的正整数,由a*b+c<=a*(b+c)能够知道。先算乘法后算加法时表达式的值最小,

先算加法后算乘法时表达式的值最大。

由这个思路,我先把表达式中的运算符和数字都提取出来放在栈中,然后依据两种情况进行计算。

能够写出代码后WA了无数次就是过不了。。。

。。

以下的AC代码是看了别人的题解后模仿写出的,其基本的思路是一样,可是他用数组模拟了栈。

然后直接在从表达式中提取数据的过程中进行了计算;我认为他思路比較巧妙的一点是,在第一个数字前

就如果了一个运算符。将第一个数字和其它的数字在形式上统一了起来,这样大大的简化了处理过程。

另外这个题目的结果比較大,须要用double类型来保存。

代码例如以下:

<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std; int main()
{
int i,j,k,t;
char str[100];
double min,max,stack[30];
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
i=0; min=0;max=1.0;
int top=0;
char ch='+';
while(str[i]!='\0')
{
k=0;
while(str[i]>='0'&&str[i]<='9')
{
k=k*10+str[i]-'0';
i++;
}
if(ch=='+')
stack[++top]=k;
else
stack[top]*=k;
if(str[i]!='\0')
ch=str[i++];
}
for(i=1;i<=top;i++)
min+=stack[i];
top=0; i=0; ch='*';
while(str[i]!='\0')
{
k=0;
while(str[i]>='0'&&str[i]<='9')
{
k=k*10+str[i]-'0';
i++;
}
if(ch=='*')
stack[++top]=k;
else
stack[top]+=k;
if(str[i]!='\0')
ch=str[i++];
}
for(i=1;i<=top;i++)
max*=stack[i];
printf("The maximum and minimum are %0.lf and %0.lf.\n",max,min);
}
return 0;
}
</span>

找不到错误的WA代码例如以下:

<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std; int main()
{
char str[10000];
int i,j,k,t;
double a[10000];
scanf("%d",&t);
while(t--)
{
stack<double>s1,s2;
stack<char>s3,s4;
scanf("%s",str);
double minnum=0,maxnum=1;
int len=strlen(str);
k=0;
for(i=0;i<len;i++)
{
k=k*10+str[i]-'0';
if(str[i]=='+'||str[i]=='*')
break;
}
if(i>=len)
{
printf("The maximum and minimum are %d and %d.\n",k,k);
continue;
}
for(i=0;i<len;i++)
{
k=0;
while(str[i]!='*'&&str[i]!='+'&&i<len)
{
k=k*10+str[i]-'0';
i++;
}
s1.push(k);
s2.push(k);
s3.push(str[i]);
s4.push(str[i]);
}
s3.pop(); s4.pop();
k=0;
while(1)
{
char ch=s3.top();
s3.pop();
if(ch=='*')
{
int k1=s1.top();
s1.pop();
int k2=s1.top();
s1.pop();
s1.push(k1*k2);
}
else
{
a[k++]=s1.top();
s1.pop();
}
if(s3.empty())
{
a[k++]=s1.top();
s1.pop();
break;
}
}
for(i=0;i<k;i++)
minnum+=a[i];
k=0;
while(1)
{
char ch=s4.top();
s4.pop();
if(ch=='+')
{
int k1=s2.top();
s2.pop();
int k2=s2.top();
s2.pop();
s2.push(k1+k2);
}
else
{
a[k++]=s2.top();
s2.pop();
}
if(s4.empty())
{
a[k++]=s2.top();
s2.pop();
break;
}
}
for(i=0;i<k;i++)
maxnum*=a[i];
printf("The maximum and minimum are %0.lf and %0.lf.\n",maxnum,minnum);
}
return 0;
}
</span>

uva--10700的更多相关文章

  1. UVA 10700 Camel trading 无括号的表达式 贪心

    题意:给出只包含数字和+*的表达式,你可以自己安排每一个运算的顺序,让你找出表达式可能得到的最大值和最小值. 很明显,先乘后加是最小值,先加后乘能得到最大值. 其实不是很明显... 证明下: 数字的范 ...

  2. UVa 10700 - Camel trading

    题目大意:给一个不含括号.只有+和*运算的表达式,数字的范围在1到20之间,算出计算结果的可能最大值和最小值. 贪心,如果加法优先级比乘法高,那么得出的结果为最大值.(a+b)*c = a*c + b ...

  3. uva:10700 - Camel trading(贪婪)

    题目:10700 - Camel trading 题目大意:给出一些表达式,表达式由数字和加号乘号组成,数字范围[1,20].这些表达式可能缺少了括号,问这种表达式加上括号后能得到的最大值和最小值. ...

  4. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  5. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  6. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  7. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

  8. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

  9. UVA数学入门训练Round1[6]

    UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...

  10. UVA - 1625 Color Length[序列DP 代价计算技巧]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

随机推荐

  1. java与OC比较

    转自:http://blog.sina.com.cn/s/blog_93742d0d010165qi.html 1.Cocoa是什么?Cocoa是使用OC语言编写的工具包,里面有大量的类库.结构体,说 ...

  2. C++中类的多态与虚函数的使用

    C++的三大特性:封装.继承.多态.以前学的时候自己没去总结,记得在一本c++入门的书讲得还是比较清楚.今天上网找了一下多态,找到下面这篇文章写得比较清晰. http://pcedu.pconline ...

  3. [转载] 基于Dubbo的Hessian协议实现远程调用

    转载自http://shiyanjun.cn/archives/349.html Dubbo基于Hessian实现了自己Hessian协议,可以直接通过配置的Dubbo内置的其他协议,在服务消费方进行 ...

  4. python/numpy/tensorflow中,对矩阵行列操作,下标是怎么回事儿?

    Python中的list/tuple,numpy中的ndarrray与tensorflow中的tensor. 用python中list/tuple理解,仅仅是从内存角度理解一个序列数据,而非数学中标量 ...

  5. [Asp.Net Core] 1. IIS中的 Asp.Net Core 和 dotnet watch

    在基于传统的.NET Framework的Asp.Net Mvc的时候,本地开发环境中可以在IIS中建立一个站点,可以直接把站点的目录指向asp.net mvc的项目的根目录.然后build一下就可以 ...

  6. tensorflow初探

    TensorFlow是一个采用数据流图,用于数值计算的开源软件库.自己接触tensorflow比较的早,可是并没有系统深入的学习过,现在TF在深度学习已经成了"标配",所以打算系统 ...

  7. 【微软大法好】VS Tools for AI全攻略(3)

    接着上文,现在我们需要一种穷人的方法来搭建好Azure虚拟机. 思路很简单,因为AI组件的原理其实是传送了script文件和命令上去,那么我们这个虚拟机只要做好了所有的配置,那么我们就可以将它当作深度 ...

  8. 对jQuery源码的一点感悟

    1.  链式写法 这是jQuery语法上的最大特色,也许该改改POJO里的set方法,和其他的非get方法什么的,可以把多行代码合并,减去每次敲打对象变量的麻烦 2.  动态参数 偶尔使用Java的动 ...

  9. js计时函数实现秒表的开始-暂停-清零功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 继webpack后又一打包神器Parcel

    前言: 在继grunt.gulp实现自动化构建之后,webpack又引领前端打包潮流,众所周知的是,vue-cli的脚手架就是基于webpack进行项目打包的.而webpack还在上升的势头的时候,又 ...