LOJ10019生日蛋糕

Mr.W 要制作一个体积为 N*π 的 M 层生日蛋糕,每层都是一个圆柱体。

设从下往上数第 i 蛋糕是半径为 R_i,高度为 H_i 的圆柱。当 i<M 时,要求 R_i>R_{i+1} 且 H_i>H_{i+1} 。由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积 Q 最小。

令Q=S π ,请编程对给出的 N 和 M ,找出蛋糕的制作方案(适当的 R_i 和 H_i 的值),使 S 最小。(除 Q 外,以上所有数据皆为正整数)

birthdaycake.png

输入格式

第一行为 N ,表示待制作的蛋糕的体积为Nπ ;

第二行为 M ,表示蛋糕的层数为 M 。

输出格式

输出仅一行,一个整数 S(若无解则 S=0 )。

样例
输入复制
100
2
输出复制
68

数据范围与提示

对于全部数据N<=1E4,M<=20。

________________________________________

重新做了一下,几乎所有的剪枝都想到了,可是搜索顺序还是出问题了!

第34、35行如果从小到大循环就会挂掉20分!

为什么!!!???

________________________________________

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 int ans=0x7fffffff;
 5 int vv[25],ss[25];
 6 inline void dfs(int c,int r,int h,int v,int s)
 7 {
 8     
 9     
10     if(c==m+1 && 0==v && s<ans)
11     {
12         ans=s;
13         return ;
14     }
15     if(c>m)return;
16     if(r*r*h+vv[c+1]>v)return ;
17     if(r*r*h*(m-c+1)<v)return;
18     if(s+r*2*h+ss[c+1]>=ans)return ;
19     
20     for(int i=r-1;i>=m-c;--i)
21         for(int j=h-1;j>=m-c;--j)
22             dfs(c+1,i,j,v-r*r*h,s+2*r*h);
23 }
24 int main()
25 {
26     scanf("%d%d",&n,&m);
27     int nn=sqrt(n);
28     for(int i=m;i>=1;--i)
29     {
30         int ii=m-i+1;
31         vv[i]=vv[i+1]+ii*ii*ii;
32         ss[i]=ss[i+1]+2*ii*ii;
33     }
34     for(int i=nn;i>=m;--i)
35         for(int j=n/(m*m);j>=m;--j)
36             dfs(1,i,j,n,i*i);
37     if(ans==0x7fffffff)ans=0;
38     printf("%d",ans);
39     return 0;
40 }
View Code

 

posted on 2020-11-24 16:55  gryzy  阅读(141)  评论(0编辑  收藏  举报

导航