_(: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-9 using
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