您的位置:首页 > 其它

hdu 4112 Break the Chocolate

2011-11-11 17:25 302 查看
告诉一个n*m*k的长方体

用手扳:次数=(n-1)+(m-1)*n+(k-1)*n*m;//化简后居然是:n*m*k-1;

把一个n*m*k的方块先扳n-1次,得到n个小方块,再把它们每个扳m-1下,得到n*m个小方块,最后把它们每个扳k-1下,这样每个方块都是1*1*1的了。

用刀切:打表

用刀的时候,这道题其实就变成了这样一个问题:给你3条直线,要求把每条直线切成长度为1的小段,最少切多少刀?

长度 1 2 3 4 5 6 7 8 9 10

切的次数 0 1 2 2 3 3 3 3 4 4

不难发现 dp[i*2]=dp[i*2-1]=dp[i]+1;(可以画图体味下)

View Code

#include <stdio.h>

__int64 dp[3005],k,m,n;

void init()
{
int i;
dp[1]=0,dp[2]=1;
for(i=2;i<=1005;i++)
{
dp[i*2]=dp[i*2-1]=dp[i]+1;
}
}

int main()
{
int T,i,j=0;
init();
scanf("%d",&T);
while (T--)
{
scanf("%lld%lld%lld",&n,&m,&k);
printf("Case #%d: ",++j);
printf("%I64d",n-1+(m-1)*n+(k-1)*n*m);
printf(" %I64d\n",dp
+dp[m]+dp[k]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: