深入解析:CodeForces479A-Expression(数学+枚举)
2025-09-27 09:20 tlnshuju 阅读(12) 评论(0) 收藏 举报题目描述
皮特亚在学校读书,他特别热爱数学。最近他的班级正在学习算术表达式。上节课老师在黑板上写了三个正整数 a , b , c a,b,c a,b,c。
题目要求在这些数字之间插入加号 + 和乘号 *,还可以使用括号,使得最终表达式的结果尽可能大。
举个例子:假设老师在黑板上写了 1 , 2 , 3 1,2,3 1,2,3 三个数字。以下是几种插入运算符和括号的方式:
- 1 + 2 × 3 = 7 1+2\times3=7 1+2×3=7
- 1 × ( 2 + 3 ) = 5 1\times(2+3)=5 1×(2+3)=5
- 1 × 2 × 3 = 6 1\times2\times3=6 1×2×3=6
- ( 1 + 2 ) × 3 = 9 (1+2)\times3=9 (1+2)×3=9
注意运算符只能插入在 a a a 和 b b b 之间,以及 b b b 和 c c c 之间,也就是说不能交换数字的顺序。
例如在这个例子中,你不能得到 ( 1 + 3 ) × 2 (1+3)\times2 (1+3)×2 这样的表达式。
显然,在这个例子中能获得的最大值是 9 9 9。
你的任务是:给定 a , b , c a,b,c a,b,c,输出你能获得的最大值。
输入格式
输入包含三个整数 a , b , c a,b,c a,b,c,每个数字独占一行。
输出格式
输出你能获得的表达式的最大值。
样例 #1
输入
1
2
3
输出
9
样例 #2
输入
2
10
3
输出
60
提示
数据范围: 1 ≤ a , b , c ≤ 10 1 \leq a,b,c \leq 10 1≤a,b,c≤10
提交链接
思路分析
枚举 a ∼ b a \sim b a∼b之间的符号、 b ∼ c b \sim c b∼c 之间的符号。
- a + b + c a + b + c a+b+c
- a ∗ b ∗ c a * b * c a∗b∗c
- a ∗ b + c a * b + c a∗b+c
- a + b ∗ c a + b * c a+b∗c
对于 3 3 3 和 4 4 4 这两种情况,考虑括号的位置,产生两种新的情况:
- a ∗ ( b + c ) a * (b + c) a∗(b+c)
- ( a + b ) ∗ c (a + b) * c (a+b)∗c
对于 6 6 6 种情况求最大值。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a , b , c;
cin >> a >> b >> c;
int mx = 0;
/*求所有情况中的最大值*/
mx = max(mx , a + b + c);
/*max():求两者中的最大值*/
mx = max(mx , a * b * c);
mx = max(mx , a + b * c);
mx = max(mx , (a + b) * c);
mx = max(mx , a * b + c);
mx = max(mx , a * (b + c));
cout << mx;
return 0;
}
思维进阶:
只需要求 1 、 2 、 5 、 6 1、2、5、6 1、2、5、6 这四种情况即可。
5 5 5 是由 3 3 3 的得来的,分析 式子 5 5 5 和式子 3 3 3 的关系:
式子 5 − 式子 3 = a ∗ ( b + c ) − ( a ∗ b + c ) = a ∗ b + a ∗ c − a ∗ b − c = a ∗ c − c = c ∗ ( a − 1 ) 式子 5 - 式子 3 = a * (b + c) - (a * b + c) = a * b + a * c - a * b - c = a *c - c = c * (a - 1) 式子5−式子3=a∗(b+c)−(a∗b+c)=a∗b+a∗c−a∗b−c=a∗c−c=c∗(a−1)
数据范围: 1 ≤ a , b , c ≤ 10 1 \leq a,b,c \leq 10 1≤a,b,c≤10,所以 a − 1 ≥ 0 a - 1≥ 0 a−1≥0 ,即 式子 5 5 5 ≥ 式子 3 3 3,只考虑式子 5 5 5 即可。
同理,对于式子 4 4 4 和式子 6 6 6,只考虑式子 6 6 6 即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a , b , c;
cin >> a >> b >> c;
int mx = 0;
/*求所有情况中的最大值*/
mx = max(mx , a + b + c);
/*max():求两者中的最大值*/
mx = max(mx , a * b * c);
//mx = max(mx , a + b * c);
mx = max(mx , (a + b) * c);
//mx = max(mx , a * b + c);
mx = max(mx , a * (b + c));
cout << mx;
return 0;
}
浙公网安备 33010602011771号