P5951 [BOI2003] Barrel 题解

· · 题解

物理 + 数学题。

- 物理部分

根据浮力可以发现一个坑点:密度小的物体会浮在水面上,所以我们在做的时候要根据密度来判断物体是否完全浸入水中。

- 数学部分

学过 6 年级的同学都知道求长方体、正方体、圆柱的体积计算公式:

V=Sh

根据上面这个公式可以求出逆定理:

S=\frac{V}{h} h=\frac{V}{S}

在这里,我们需要用到第二个逆定理:根据输入的 SV,我们可以求出水的高度是多少,也就是 \frac{V}{S}

然后,就是根据密度判断物体是否完全浸入水中,算出浸入水中部分的体积,用沉入水中部分的体积除以底面积得到沉入水中的部分使得水面上升了多少。

最后把每次算出的上升的高度累加起来并加上原始水的高度即可。

#include<bits/stdc++.h>
using namespace std;
int s,h,v,n;
double ans;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>s>>h>>v>>n;
    ans=1.0*v/s;//原始水面高度 
    for(;n--;){
        double lc,md;
        cin>>lc>>md;
        if(md>=1)ans+=lc*lc*lc/s;//完全浸入水中 
        else ans+=lc*lc*lc*md/s;//不完全浸入水中 
        if(ans>=h){//有溢出的水 
            cout<<h;//因为已经有溢出的水,所以无论如何都是满的,直接输出水池的高 
            return 0;
        }
    }
    printf("%.7lf",ans);
    return 0;
}