题目描述
TT有一个A×B×C的长方体。这个长方体是由A×B×C个1×1×1的小正方体组成的。现在TT想给每个小正方体涂上颜色,需要满以下三点条件:
- 每个小正方体要么涂成红色,要么涂成蓝色。
- 所有红色的小正方体组成一个长方体。
- 所有蓝色的小正方体组成一个长方体。
现在TT想知道红色小正方体的数量和蓝色小正方体的数量的差异。
你需要找到红色正方体的数量与蓝色正方体的数量差值的绝对值的最小值。
即min{|红色正方体数量 - 蓝色正方体数量|}。
输入格式
输入仅一行,三个数A B C (2≤A,B,C≤10^9)。
输出格式
输出一个数字,即差值绝对值的最小值。
输入输出案例
Simple Input 1
3 3 3
Simple Output 1
9
Simple Input 2
2 2 4
Simple Output 2
0
Simple Input 3
5 3 5
Simple Output 3
15
样例解释
解题思路
其实这道题似乎是小学的时候的一个经验之谈?
对于一个长方体,将其一刀切成两个长方体,如何使横截面积最小?答案是对着最长的那条边切下去,这样的横截面积就是两个较短边的乘积,显然是三个横截面积里最小的一个。
那么对于这道题来说,原理一模一样,不过由于需要保证小正方体的数量差更小,所以这一刀,我们要尽量从最长边的中心去切。
如果最长边长度为奇数,那最后的红蓝正方体的数量差就是横截面积;
如果最长边长度为偶数,那最后的红蓝正方体的数量差就是0。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
long long a, b, c;
cin >> a >> b >> c;
//Keep a>b>c
if (a < b)
swap(a, b);
if (a < c)
swap(a, c);
if (b < c)
swap(b, c);
if (a % 2)//最大边为奇数
{
cout << b * c << endl;
}
else
cout << 0 << endl;
}