题意:

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

思路:

表达式中的数都是不大于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. Unity 游戏框架搭建 (十九) 简易对象池

    在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...

  2. liunx 系统调用 getopt() 函数

    命令行参数解析函数 -- getopt() getopt()函数声明如下: #include <unistd.h>int getopt(int argc, char * const arg ...

  3. 【游戏开发】Excel表格批量转换成CSV的小工具

    一.前言 在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求.这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就 ...

  4. python进阶------进程线程(五)

    Python中的IO模型 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别 ...

  5. 发现大量的TIME_WAIT解决办法 -- 修改内核参数

    今天早上一上班,有同事就反映公司好几个网站都打不开,登陆数据库 服务器(windows),发现很卡,于是重启了下服务器,进入系统后,没过一会问题依旧,查看了下系统进程,发现mysql占用率达到99%, ...

  6. 基于FPGA的有限状态机浅析

    前言:状态机大法好,状态机几乎可以实现一切时序逻辑电路. 有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机 ...

  7. [DFS遍历图]UVA10562 Undraw the Trees

    传送门: 1. UVA - 10562 2. Vjudge [看图写树]     将题目中给出的树改写为 括号表示法 即 (ROOT (SON1(...) (SON2(...)...(SONn(... ...

  8. Python数据分析(二): Pandas技巧 (2)

    Pandas的第一部分: http://www.cnblogs.com/cgzl/p/7681974.html github地址: https://github.com/solenovex/My-Ma ...

  9. python学习笔记 改变字符串中的某一位

    a = ' a = list(a) a[2] = ' news = ''.join(a) print news,a 注意不能使用 news = '' news.join(a) 因为news.join只 ...

  10. java基础回顾(2)

    java中只有两种类型:基础类型.引用类型 8中基本类型:byte  short int long float double char boolean,其中byte类型取值范围[-2^7~2^7-1] ...