题目描述
堆积货物
时间限制:C/C++语言1000ms,其他语言3000ms
内存限制:C/C++语言65536kb,其他语言589824kb
题目描述:
在某个仓库中,堆积了很多的货物,每个货物是一个正方体的,边长为1。所有货物恰好堆积成一个长方体,边长为R * C * L。
目前,在某次确认货物的时候,管理员意识到这一堆货物被小偷偷走了一些。
这个小偷将原来的R * C * L的货物组成的长方体偷成了恰好(R - 2) * (C - 1) * (L - 2)的长方体。
但是管理员记不得R、C、L的具体数值了,他只能计算现在的货物总数。他希望算出来最坏情况下被偷了多少的货物,输出这个最坏的值。
输入
输入为一个数 n,表示题面中的(R - 2) * (C - 1) * (L - 2)
输出
输出为一个数,表示最坏情况下被偷了多少的货物
样例输入
4
样例输出
41
提示
对于100%的数据:1 <= n <= 109
样例解释:R = 3, C = 5, L = 3, 3 * 5 * 3 - (3 - 2) * (5 - 1) * (3 - 2) = 41
代码
#include<iostream>
using namespace std;
int main(){
long long n;
cin >> n;
cout << 9 * (n + 1) - n;
return 0;
}
答题思路
这道题代码看起来很简单,但当时做起来其实不简单。
- 首先输出结果那个公式9 * (n + 1) - n是归纳总结出来的:
原体积是R * C * L,现体积是n = (R - 2) * (C - 1) * (L - 2),设现长方体边长R0、C0、L0则:
原体积为R0 + 2、C0 + 1、L0 + 2,被偷走的体积为(R0 + 2) * (C0 + 1) * (L0 + 2) - n。
经过计算发现如下规律:
n R0 + 2 C0 + 1 L0 + 2 被偷体积 4 1 + 2 4 + 1 1 + 2 3 * 3 * 5 - 4 = 41 5 1 + 2 5 + 1 1 + 2 3 * 3 * 6 - 5 = 49 6 1 + 2 6 + 1 1 + 2 3 * 3 * 7 - 6 = 57 … … … … … n 1+2 n+1 1+2 3 * 3 * (n + 1) - n 也就是说不管n是多少,都是当这个长方体为(R0, C0, L0) = (1, n, 1)时,被偷掉的体积最大。
- 然后,题设要求 “ 对于100%的数据:1 <= n <= 109 ”,109大概就一个int的范围。
但是,,计算机在计算我们那个公式的时,其过程中的所有数值的范围是由定义的 n 的范围决定的;
也就是说,我们在定义 n 的范围时,要定义成那个公式的数值范围,因此是long long n。
个人经验,可能有错漏,望评论指正。