Reginal2011_Chengdu_B Break the Chocolate

题目地址: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;
        
    }
    
  
}





转载于:https://www.cnblogs.com/jingqi814/p/3644379.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值