void-man

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

给出方块的个数n,让你排列成一个矩形,并且要求他的表面积最小,问你如何包装

很简单也很笨的算法,就是先找出n的约数,然后进行两层循环,判断是否n%i*j==0,如果等于0,就找到符合的条件

那么就计算此时的表面积,依次枚举出所有情况,然后与min的对比,最后得出答案。

关键是多代码循环的剪枝优化

1 #include<iostream>
2  using namespace std;
3 int main()
4 {
5 int i,j,k,t,n,s,tmp;
6 cin>>t;
7 while(t--)
8 {
9 scanf("%d",&n);
10 s = INT_MAX;
11 i=j=k=1;
12 for(i=1;;++i)
13 {
14 for(j=i;;++j)
15 {
16 if(i*j>n)break;//剪枝,优化
17 if(n%(i*j)==0)
18 {
19 k=n/(i*j);
20 tmp = i*j+j*k+i*k;
21 if(s>tmp)s=tmp;
22 }
23 }
24 if(i*i>n)break;
25 }
26 printf("%d\n",s+s);
27 }
28 return 0;
29 }
posted on 2011-04-13 23:24  void-man  阅读(160)  评论(0)    收藏  举报