Timus 1836

系统 1835 0
      
        #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)如果四个水位在同一平面中的话,那么总会形成一个平行四边形。

Timus 1836


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论