当前位置: 首页 > news >正文

深入解析:CodeForces479A-Expression(数学+枚举)

深入解析:CodeForces479A-Expression(数学+枚举)

2025-09-27 09:20  tlnshuju  阅读(0)  评论(0)    收藏  举报

题目描述

皮特亚在学校读书,他特别热爱数学。最近他的班级正在学习算术表达式。上节课老师在黑板上写了三个正整数 a,b,ca,b,ca,b,c

题目要求在这些数字之间插入加号 + 和乘号 *,还可以使用括号,使得最终表达式的结果尽可能大。

举个例子:假设老师在黑板上写了 1,2,31,2,31,2,3 三个数字。以下是几种插入运算符和括号的方式:

  • 1+2×3=71+2\times3=71+2×3=7
  • 1×(2+3)=51\times(2+3)=51×(2+3)=5
  • 1×2×3=61\times2\times3=61×2×3=6
  • (1+2)×3=9(1+2)\times3=9(1+2)×3=9

注意运算符只能插入在 aaabbb 之间,以及 bbbccc 之间,也就是说不能交换数字的顺序。

例如在这个例子中,你不能得到 (1+3)×2(1+3)\times2(1+3)×2 这样的表达式。

显然,在这个例子中能获得的最大值是 999

你的任务是:给定 a,b,ca,b,ca,b,c,输出你能获得的最大值。

输入格式

输入包含三个整数 a,b,ca,b,ca,b,c,每个数字独占一行。

输出格式

输出你能获得的表达式的最大值。

样例 #1

输入

1
2
3

输出

9

样例 #2

输入

2
10
3

输出

60

提示

数据范围:1≤a,b,c≤101 \leq a,b,c \leq 101a,b,c10

提交链接

Expression

思路分析

枚举 a∼ba \sim bab之间的符号、 b∼cb \sim cbc 之间的符号。

  1. a+b+ca + b + ca+b+c
  2. a∗b∗ca * b * cabc
  3. a∗b+ca * b + cab+c
  4. a+b∗ca + b * ca+bc

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

  1. a∗(b+c)a * (b + c)a(b+c)
  2. (a+b)∗c(a + b) * c(a+b)c

对于 666 种情况求最大值。

参考代码

#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、61、2、5、61256 这四种情况即可。

555 是由 333 的得来的,分析 式子 555 和式子 333 的关系:

式子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≤101 \leq a,b,c \leq 101a,b,c10,所以 a−1≥0a - 1≥ 0a10 ,即 式子 555 ≥ 式子 333,只考虑式子 555 即可。

同理,对于式子 444 和式子 666,只考虑式子 666 即可。

参考代码

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