#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 ) // 有一個(gè)點(diǎn)為0,但其實(shí)其他三點(diǎn)確定了該點(diǎn)應(yīng)該是大于0,就會(huì)出現(xiàn)計(jì)算到hx是負(fù)數(shù)
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; // 把整個(gè)有水的部分抬高h(yuǎn)x
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 剛開(kāi)始我使用長(zhǎng)度來(lái)比較,結(jié)果wa3,因?yàn)?5, 4, 5, 4 這樣的數(shù)據(jù)可以通過(guò)長(zhǎng)度比較,但其實(shí)是不符合事實(shí)的
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 ;
}
純數(shù)學(xué)題,有幾個(gè)要點(diǎn):
1)四個(gè)水位點(diǎn)在同一個(gè)平面的情況下,其容積計(jì)算公式是四個(gè)水位高度的平均值乘以底面積
2)當(dāng)有一個(gè)水位點(diǎn)為0,其他都不為0的時(shí)候,那么為0的水位點(diǎn)還是可以由其他三個(gè)水位點(diǎn)計(jì)算出來(lái)(一個(gè)沉下去的點(diǎn),前提是其他三個(gè)點(diǎn)的數(shù)據(jù)符合事實(shí))
3)如果四個(gè)水位在同一平面中的話,那么總會(huì)形成一個(gè)平行四邊形。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
