题意:一块三维巧克力,手掰和刀切,最少几次,可分为n*m*k个单元块
题解:手掰,要有n*m*k个就要掰n*m*k下,当然,你掰下最后第二个的时候,最后一个就自然出现了,所以手掰是n*m*k-1个;
刀切, 可以上下叠起来切, 所以每一维的处理办法一样, 切一半+(一半的一半)+(一半的一半的一半)+..........,向上取整。
//
#include<iostream> #include<cstdio> using namespace std; __int64 f(__int64 n) { int ans=0; while(n>1) { ans++; if(n%2) n=(n/2)+1; else n/=2; } return ans; } int main() { __int64 T; cin>>T; for(int i=1; i<=T; i++){ __int64 n,m,k; __int64 ans1=0, ans2=0; cin>>n>>m>>k; ans1 = n*m*k-1; ans2 = f(n)+f(m)+f(k); cout<<"Case #"<<i<<": "<<ans1<<" "<<ans2<<endl; } return 0; }
code