`
java-mans
  • 浏览: 11420446 次
文章分类
社区版块
存档分类
最新评论

10700 - Camel trading

 
阅读更多
/*
推荐题型:三星

数学题,模拟计算过程

题意:一个表达式无括号,只有*和+两种运算符,求加入括号后表达式的最大和最小值。

思路:通过观察,最小值时所有的+号在一个级别。最大值时所有的*号在一个级别。然后模拟计算过程即可。
比如: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;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics