#include
<
iostream
>
using
namespace
std;
double
len,h1,h2,h3,h4;
double
sb_cal(
double
h_counter,
double
h_adj1,
double
h_adj2) {
double
hx, rebuild_V, l1, l2, rm_part_V, final_V;
if
( h_counter
<
h_adj1
+
h_adj2 )
return
-
1
;
hx
=
h_counter
-
(h_adj1
+
h_adj2);
if
( hx
<
0
)
//
有一個點為0,但其實其他三點確定了該點應該是大于0,就會出現計算到hx是負數
return
-
1
;
l1
=
(len
*
hx)
/
( hx
+
h_adj1 );
l2
=
(len
*
hx)
/
( hx
+
h_adj2 );
rebuild_V
=
((h_adj1
+
hx
+
h_counter
+
hx
+
h_adj2
+
hx)
/
4
)
*
len
*
len;
//
把整個有水的部分抬高hx
rm_part_V
=
(l1
*
l2
*
hx)
/
6
;
//
多減的部分
final_V
=
rebuild_V
-
(len
*
len
*
hx)
+
rm_part_V;
return
final_V;
}
int
cal(
double
*
v) {
double
side1,side2,ret;
if
( h1
==
0
&&
h2
==
0
&&
h3
==
0
&&
h4
==
0
||
len
==
0
) {
*
v
=
0
;
return
1
;
}
if
( h1
==
0
&&
h2
==
0
||
h2
==
0
&&
h3
==
0
||
h3
==
0
&&
h4
==
0
||
h4
==
0
&&
h1
==
0
)
return
3
;
ret
=
-
1
;
if
( h1
==
0
)
ret
=
sb_cal(h3, h2, h4);
else
if
( h3
==
0
)
ret
=
sb_cal(h1, h2, h4);
else
if
( h2
==
0
)
ret
=
sb_cal(h4, h1, h3) ;
else
if
( h4
==
0
)
ret
=
sb_cal(h2, h1, h3);
else
if
( h1
-
h2
==
h4
-
h3
&&
h1
-
h4
==
h2
-
h3 )
//
no zero 剛開始我使用長度來比較,結果wa3,因為 5, 4, 5, 4 這樣的數據可以通過長度比較,但其實是不符合事實的
ret
=
(h1
+
h2
+
h3
+
h4)
/
4
*
len
*
len;
if
( ret
<
0
)
return
2
;
else
{
*
v
=
ret;
return
1
;
}
}
int
main() {
int
t,ret;
double
v;
cin
>>
t;
for
(
int
i
=
0
;i
<
t;i
++
) {
scanf(
"
%lf %lf %lf %lf %lf
"
,
&
len,
&
h1,
&
h2,
&
h3,
&
h4);
ret
=
cal(
&
v);
if
(
1
==
ret )
printf(
"
%.6f\n
"
, v);
else
if
(
2
==
ret )
printf(
"
error\n
"
);
else
printf(
"
ambiguous\n
"
);
}
return
0
;
}
純數學題,有幾個要點:
1)四個水位點在同一個平面的情況下,其容積計算公式是四個水位高度的平均值乘以底面積
2)當有一個水位點為0,其他都不為0的時候,那么為0的水位點還是可以由其他三個水位點計算出來(一個沉下去的點,前提是其他三個點的數據符合事實)
3)如果四個水位在同一平面中的話,那么總會形成一個平行四邊形。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

