您的位置:首页 > 其它

UVA10700:Camel trading(栈和队列)

2015-02-03 16:20 471 查看
题目链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=68990#problem/J
题目大意:

给一个没有加上括号的表达式且只有+ ,*两种操作符,然后要求随便怎样添加括号,求出这个表达式的最大值和最小值.

题目解析:

要求最大值,就让+的优先级大于*,要求最小值,就让*的优先级大于+。

我做的有点麻烦,有点模拟的意思,反正是水题。注意这题需要用long long,别的就没有什么需要注意了。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <queue>
#define eps 1e-9
typedef long long ll;
using namespace std;
char a[110000];
ll l,t,Z,sum,su2,M;
bool f;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
queue<ll>q;
queue<ll>q2;
while(!q.empty()) q.pop();
while(!q2.empty()) q2.pop();
scanf("%s",a);
l=strlen(a);
a[l]='T';
a[++l]='\0';
sum=1;
su2=0;
t=0;
f=false;
Z=0;
M=1;
for(ll i=0; i<l; i++)
{
if(a[i]>='0'&&a[i]<='9')
{
if(f)
t=t*10+(a[i]-'0');
else
{
t+=a[i]-'0';
f=true;
}
}
else if(a[i]=='*')
{
q.push(Z+t);
M*=t;
Z=0;
f=false;
t=0;
}
else if(a[i]=='+')
{
Z+=t;
q2.push(M*t);
M=1;
f=false;
t=0;
}
else
{
q.push(Z+t);
q2.push(M*t);
break;
}
}
while(!q.empty())
{
ll tem=q.front();
q.pop();
sum*=tem;
}
while(!q2.empty())
{
ll S=q2.front();
q2.pop();
su2+=S;
}
printf("The maximum and minimum are %lld and %lld.\n",sum,su2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: