题目链接:hdu 4112 Break the Chocolate
题目大意:给定一个N∗M∗K的巧克力,现在要用两种方式将其转换成单位大小,一种用手掰一次将两个分成两块,
一种用刀切,同一方向上可以两切好的两块叠在一起切。
解题思路:第一种就是N∗M∗K−1,第二种则预处理出dp[i],表示说该方向长度为i的时候需要切几刀,
dp[N]+dp[M]+dp[K]。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 2005;
ll N, M, K, dp[maxn];
int main () {
int cas;
scanf("%d", &cas);
dp[1] = 0;
for (int i = 2; i < maxn; i++)
dp[i] = dp[(i+1)/2] + 1;
for (int kcas = 1; kcas <= cas; kcas++) {
scanf("%I64d%I64d%I64d", &N, &M, &K);
printf("Case #%d: %I64d %I64d\n", kcas, N * M * K - 1, dp[N] + dp[M] + dp[K]);
}
return 0;
}