/*
推荐题型:三星
数学题,模拟计算过程
题意:一个表达式无括号,只有*和+两种运算符,求加入括号后表达式的最大和最小值。
思路:通过观察,最小值时所有的+号在一个级别。最大值时所有的*号在一个级别。然后模拟计算过程即可。
比如:3+11+4*1*13*12*8+3*3+8,最小值为3+11+(4*1*13*12*8)+(3*3)+8,最大值为(3+11+4)*1*13*12*(8+3)*(3+8)
题中max,min表示最终结果,max_pre,min_pre表示中间值
注意:①这里有一个小技巧,感悟一下,通过调整运算,使之与模拟达到更好的匹配。
②注意题中给出的数据,需要使用long long 或者double
*/
#include <cstdio>
#include <cstring>
const int nMax=100;
char line[nMax];
int len,p;
long long min,max;//②
long long min_pre,max_pre;
int get_dit()
{
int a=0;
for(;line[p]>='0' && line[p]<='9';p++)
a=a*10+line[p]-'0';
return a;
}
char get_opr()
{
return line[p++];
}
void solve()
{
min_pre=1;
max_pre=0;
int a=get_dit();//①无意中发现这个方法特别好
while(p!=len)
{
char b=get_opr();
if(b=='+')
{
min+=min_pre*a;
min_pre=1;
max_pre+=a;
}
else
{
max*=max_pre+a;
max_pre=0;
min_pre*=a;
}
a=get_dit();
}
min+=min_pre*a;
max*=max_pre+a;
}
int main()
{
//freopen("f://data.in","r",stdin);
int T;
scanf("%d",&T);
getchar();
while(T--)
{
min=0;
max=1;
p=0;
gets(line);
len=strlen(line);
solve();
printf("The maximum and minimum are %lld and %lld.\n",max,min);
}
return 0;
}
10700 - Camel trading
最新推荐文章于 2024-08-27 01:21:59 发布