巧克力(模拟)

描述

传送门:openjudge

 罗海川学长和孙其灵学长都喜欢吃巧克力,巧克力真的很好吃。我们团队的队员也很喜欢吃,但是由于人数比较多,而他们又不想再去买巧克力,所以两位学长决定将一个$N \times M \times K$的长方体的巧克力分解成111的正方体小块,这样就可以分给更多的人了。但是两个学长分解巧克力的方法不同,罗海川学长由于没有工具,所以只能用手掰,可以将一块掰成两块。而孙其灵学长事先有准备,有一把足够长的刀,所以孙其灵学长用刀切,可以将一些切成两半。现在你能告诉我们罗海川学长和孙其灵学长将巧克力都分解成111的正方体小块最少需要多少步吗?

Input

输入包括多组测试数据。
输入三个数 $N,M,K(1 <=N,M,K <=2000)$在一行,用空格隔开。
表示巧克力的大小$N \times M \times K$。

Output

分别输出罗海川学长和孙其灵学长分解巧克力所用的最小步数。

Examples

  • intput

    1
    2
    1 1 3
    2 2 2
  • output

    1
    2
    2 2
    7 3

思路

  • 没刀的情况很简单,就是$N \times M \times K-1$。
  • 有刀的情况也很简单,单独看每一个纬度,要切成1,就每次对半切,取两半较大的继续对半切,另一半就不用管了(显然小的那一半肯定可以叠在大的上面切完)。所以易得答案就是$\lceil \log_2N \rceil+\lceil \log_2M \rceil + \lceil \log_2K \rceil$。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
ll a,b,c,ans;
while(~scanf("%lld%lld%lld",&a,&b,&c)){
printf("%lld ",a*b*c-1);
ans=0;
if(a!=1) ans+=ceil(log(a)/log(2));
if(b!=1) ans+=ceil(log(b)/log(2));
if(c!=1) ans+=ceil(log(c)/log(2));
printf("%lld\n",ans);
}
return 0;
}
-------------本文结束 感谢您的阅读-------------

本文标题:巧克力(模拟)

文章作者:Armin

发布时间:2018年08月04日 - 18:08

最后更新:2018年08月04日 - 22:08

原始链接:http://x-armin.com/巧克力/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

小礼物走一波