题目地址:2011_Chengdu_B
题目大意:
用一个巧克力立方体,现在两种方式切割
1 徒手掰开 每次只能对一小块操作
2 用刀切,可以重叠着切。
现在给你长宽高 问分别最少要多少次才能切成1*1*1的小块。
假设是x*y*z
《1》用第一种方法 是f1=x-1 (切成x块)+x*(余下每一块需要切的次数f2) // 现在f2要切的都是1*y*z的
f2= y-1+y*(余下的每一块要切的次数f3) // 现在f2要切的都是1*1*z的
f3=z-1
所以答案就是xyz-1 // 注意可能会超int
《2》 用第二种方法切。由于每一刀后得到的新的两部分都可以叠起来再切。那么只要是还可以切的部分,都可以在一次操作下切成2部分。
所以k次操作最多可以切成2^k 块 ,分别对长宽高三个维度切就是ceil(log2(x))*ceil(log2(y))*ceil(log2(z));
代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int cas;
cin>>cas;
long long n,m,k;
for(int i=0;i<cas;i++)
{
cin>>n>>m>>k;
cout<<"Case #"<<i+1<<": "<<n*m*k-1<<" "<<ceil(log(n)/log(2))+ceil(log(m)/log(2))+ceil(log(k)/log(2))<<endl;
}
}