_(:3」∠)_
对于任意的V,要使表面积最小,H,R,h,r会符合一定的比例关系。
然后算得 表面积=C*(V的2/3次方) C为一常数。
故设V=1的时候算出C值。
对于R,V1(上面圆柱的体积),r而言,这个奇怪的组合体的表面积的函数都为单峰函数,然后三分R,再在里面三分V1,再在里面三分r,算出H和h的值,更新最小表面积。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 |
//通过这个计算常数C#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#include<cmath>#define eps 1e-9using
namespace std;const
double pi=acos(-1);double
v=1.0;double
ans=9999999;double
calr(double
R2,double
R1,double
V1){ double
sum=(V1/(pi*R1*R1))*2*pi*R1; double
V2=v-V1; double
H=V1/(pi*R1*R1); double
h=(3*V2)/((R1*R1+R1*R2+R2*R2)*pi); sum+=(R1+R2)*pi*(sqrt((R1-R2)*(R1-R2)+h*h)); sum+=pi*R2*R2; ans=min(sum,ans); return
sum;}double
calV(double
V1,double
R1){ double
L=0,R=R1; double
lmid,rmid; while((R-L)>=eps) { lmid=(2*L+R)/3.0; rmid=(L+2*R)/3.0; if(calr(lmid,R1,V1)<calr(rmid,R1,V1)) R=rmid; else
L=lmid; } return
calr(lmid,R1,V1);}double
calR(double
R1){ double
L=0,R=v; double
lmid,rmid; while((R-L)>=eps) { lmid=(2*L+R)/3.0; rmid=(L+2*R)/3.0; if(calV(lmid,R1)<calV(rmid,R1)) R=rmid; else
L=lmid; } return
calV(lmid,R1);}int
main(){ double
L=0,R=1000000; double
lmid,rmid; while((R-L)>=eps) { lmid=(2*L+R)/3.0; rmid=(L+2*R)/3.0; if(calR(lmid)<calR(rmid)) R=rmid; else
L=lmid; } printf("%.12lf\n",ans);}//算得常数C=3.939773107886故AC代码为:#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>using
namespace std;int
main(){ double
hehe=3.939773107886; double
v; while(cin>>v) { printf("%.7lf\n",hehe*pow(v,2.0/3.0)); }} |
ZOJ 3550 Big Keng,布布扣,bubuko.com
原文:http://www.cnblogs.com/morimiya/p/3624469.html