uva--10700
题意:
输入一串仅仅含有+和*号的表达式,能够通过加入括号来改变表达式的值,求表达式的最大最小值。
思路:
表达式中的数都是不大于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的更多相关文章
- UVA 10700 Camel trading 无括号的表达式 贪心
题意:给出只包含数字和+*的表达式,你可以自己安排每一个运算的顺序,让你找出表达式可能得到的最大值和最小值. 很明显,先乘后加是最小值,先加后乘能得到最大值. 其实不是很明显... 证明下: 数字的范 ...
- UVa 10700 - Camel trading
题目大意:给一个不含括号.只有+和*运算的表达式,数字的范围在1到20之间,算出计算结果的可能最大值和最小值. 贪心,如果加法优先级比乘法高,那么得出的结果为最大值.(a+b)*c = a*c + b ...
- uva:10700 - Camel trading(贪婪)
题目:10700 - Camel trading 题目大意:给出一些表达式,表达式由数字和加号乘号组成,数字范围[1,20].这些表达式可能缺少了括号,问这种表达式加上括号后能得到的最大值和最小值. ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...
- 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 ...
- UVA - 1625 Color Length[序列DP 代价计算技巧]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
随机推荐
- 【5】namenode启动过程
1.格式化空间(第一次启动的操作): 命令:bin/hadoop -format //用于格式化HDFS,如果不是首次格式化,需要删除下面配置的tmp目录后再进行core-site.xml的配置: / ...
- 极简版ASP.NET Core学习路径及教程
绝承认这是一个七天速成教程,即使有这个效果,我也不愿意接受这个名字.嗯. 这个路径分为两块: 实践入门 理论延伸 有了ASP.NET以及C#的知识以及项目经验,我们几乎可以不再需要了解任何新的知识就开 ...
- CLR类型设计之属性
在之前的随笔中,我们探讨了参数,字段,方法,我们在开始属性之前回顾一下,之前的探讨实际上串联起来就是OOP编程的思想,在接下来的文章中,我们还会讨论接口(就是行为),举个例子:我们如果要做一个学生档案 ...
- Python源码分析
- mybatis简单搭建
背景 闲来没事把mybatis再熟悉一下,可能之前自己搭过没有记录.mybatis其实就是一个orm框架,在我们之前做.net工作的时候,我们的ef,dapper等都是这样的框架,java现在web流 ...
- enote笔记法(2)——why的使用
章节:why的使用 用法: why 概念|词汇(比概念更一般的形式的keyword)|短语|句子 用法1: why 概念|why keyword([比概念更一般的形式的keyword]) “why 概 ...
- 延迟执行之 Invoke 函数
Invoke 函数需要继承 MonoBehaviour 类后才能使用. Invoke(string str,float a):a 秒后执行名为 str 函数(只会调用一次). Invoke(strin ...
- SQL---存储过程---sp_addextendedproperty表字段加描述
相信很多朋友对利用SQL创建表已经很熟悉了,但我们发现在创建表的同时不能像添加默认值或者主键一样为列加上说明信息,所以我们经常是创建表后再到表的可视化设计器中为列加上说明,这样操作起来就相当麻烦了,本 ...
- iOS 多线程之线程锁Swift-Demo示例总结
线程锁是什么 在前面的文章中总结过多线程,总结了多线程之后,线程锁也是必须要好好总结的东西,这篇文章构思的时候可能写的东西得许多,只能挤时间一点点的慢慢的总结了,知道了线程之后要了解线程锁就得先了解一 ...
- Qt---Xml文件解析
本文我们通过一个读取Xml文件的小例子来学习QXmlStreamReader. Xml 简介 Xml的全称是可扩展标记语言(EXtensible Markup Language),同HTML一样是一种 ...