P5951 [BOI2003] Barrel 题解
题目大意
有一个大水池,往里面放一些立方体,求放入立方体后的水面高度。
题目思路
将情况进行分类讨论,分为以下几种情况:
-
物体不浮起
-
物体浮起
-
有水溢出
分类讨论
-
当物体不浮起时,加上其密度即可。
-
当物体浮起时,加上其入水体积。
-
当有水溢出时,直接结束循环。
知识储备
-
当物体密度小于液体密度时,物体漂浮。
-
当物体密度等于液体密度时,物体悬浮。(这种情况基乎全部题解都表述错误或没说清楚。)
-
当物体密度大于液体密度时,物体沉底。
满分代码
加上了详细的代码注释。
#include<iostream>
using namespace std;
int S,H,V;//S,H,V,n意思如题目
int n;
double a,ruo;//a为棱长,ruo是密度在课本中读音的谐音
int main()
{
cin>>S>>H>>V;
cin>>n;
double h=1.0*V/S;//计算初始情况
while(n--)
{
cin>>a>>ruo;
double v=a*a*a;//v用来表示物体体积
if(ruo>1)//沉底
{
h+=v/S;
}
if(ruo==1)//悬浮
{
h+=v/S;
}
if(ruo<1)//沉底
{
h+=v*ruo/S;
}
if(h>=H)//溢水
{
cout<<H<<endl;//输出
break;//结束循环
}
}
printf("%.7lf",h);
return 0;
}