代码改变世界

深入解析: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 1a,b,c10

提交链接

Expression

思路分析

枚举 a ∼ b a \sim b ab之间的符号、 b ∼ c b \sim c bc 之间的符号。

  1. a + b + c a + b + c a+b+c
  2. a ∗ b ∗ c a * b * c abc
  3. a ∗ b + c a * b + c ab+c
  4. a + b ∗ c a + b * c a+bc

对于 3 3 3 4 4 4 这两种情况,考虑括号的位置,产生两种新的情况:

  1. a ∗ ( b + c ) a * (b + c) a(b+c)
  2. ( 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 1256 这四种情况即可。

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)(ab+c)=ab+acabc=acc=c(a1)

数据范围: 1 ≤ a , b , c ≤ 10 1 \leq a,b,c \leq 10 1a,b,c10,所以 a − 1 ≥ 0 a - 1≥ 0 a10 ,即 式子 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;
  }