您的位置:首页 > 其它

UVa 10700 Camel trading

2013-06-20 17:12 393 查看
思路:

当先计算加法时,得到的是最大值,先计算乘法时,得到的是最小值。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define MAXN 100

bool lowerPriority[45][45]; //lowerPriority[i][j]为真表示,运算符i的优先级低于运算符j

bool MinPriorityOp(char *E, char *end, char *&minPriorityOp)
{
	bool exist = false;
	char *i;
	for (i = E; i != end; i++)
	{
		if (*i == '*' || *i == '+')
		{
			if (!exist)
			{
				minPriorityOp = i;
				exist = true;
			}
			else if (lowerPriority[*i][*minPriorityOp])
			{
				minPriorityOp = i;
			}
		}
	}
	return exist;
}

long long Calc(char *E, char *end)
{
	char *min = NULL; //指向优先级最低的运算符
	if (!MinPriorityOp(E, end, min))
	{
		int val;
		sscanf(E, "%d", &val);
		return val;
	}
	switch (*min)
	{
	case '*': return Calc(E, min-1) * Calc(min+1, end);
	case '+': return Calc(E, min-1) + Calc(min+1, end);
	default: return -1;
	}
}

int main(void)
{
	lowerPriority['*']['*'] = true;
	lowerPriority['+']['+'] = true;
	char E[MAXN];
	int ncases;
	scanf("%d\n", &ncases);

	while (ncases-- != 0)
	{
		gets(E);
		
		//乘法的优先级低于加法
		lowerPriority['*']['+'] = true;
		lowerPriority['+']['*'] = false;
		long long max = Calc(E, E+strlen(E));
		//乘法的优先级高于加法
		lowerPriority['*']['+'] = false;
		lowerPriority['+']['*'] = true;
		long long min = Calc(E, E+strlen(E));

		printf("The maximum and minimum are %lld and %lld.\n", max, min);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: