UVa 10700 Camel trading

思路:

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

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庞老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值