题目链接:https://ac.nowcoder.com/acm/contest/1085/F
题解:
根据,
,可得
①
球的正视图是个圆心为(0,r),半径为r的圆,方程为②
侵入水中的体积:
体积公式是底面积×高,我们把圆形作为底面积,那么底面积为,
即
,可通过②式移项得
,
那么侵入水中的体积为,z是侵入水中的深度,上界的
,
即是我们要求的答案。
积下来答案为,我们对z进行二分,然后
即为所求。
代码:
# define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize(2)
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
#include <unordered_map>
#include <vector>
#include <queue>
#define int long long
#define fir first
#define sec second
#define IOS ios_base::sync_with_stdio(0);cin.tie(0)
using namespace std;
/*---------------------------------------------------------------------------------------------------------------------------*/
const int N = 5000 + 5;
const double pi = acos(-1.0);
typedef long long ll;
const int mod = 998244353;
//const int mod = 1e9 + 7;
#define inf 0x3f3f3f3f
struct something {
int num, period, time;
bool operator < (const something& y)const {
return y.time < time || (y.time == time && y.num < num);
}
something() {}
something(int num, int period, int time) :num(num), period(period), time(time) {}
};
int dx[8] = { 0, 0, 1,-1, 1, 1,-1,-1 };
int dy[8] = { 1,-1, 0, 0, 1,-1, 1,-1 };
double r, v;
bool f(double z) {
return pi * (-1.0 / 3.0 * z * z * z + r * z * z) >= v;
}
signed main() {
IOS;
#ifdef ONLINE_JUDGE
#else
freopen("Data.txt", "r", stdin);
#endif
cin >> r >> v;
double L = 0, R = 2 * r;
for (int i = 0; i < 1000; i++) {
/* z=2*r-h */
double z = (L + R) / 2.0;
if (f(z))R = z;
else L = z;
}
printf("%.2lf\n", 2 * r - L);
return 0;
}
题目描述:
小sun的寝室有一只小黄鸭,小黄鸭浮在水面上的样子特别可爱,现在小sun有一个问题:
为了简单,我们把小黄鸭视为一个均匀的球体,它浮在水面上的样子大概为:
图中黑色的线即为水平线,灰色的部分为没在水中的部分,现在你要求的是,这个球体浮在水面上的部分的高度(即为图中的h)。
高度定义为:一端在圆上,一端在水平线上且过圆心切垂直于水平线的线段长。
浮力定律:物体在液体中所获得的浮力,等于物体所排出液体的重量。(水的密度为1)
输入描述:
第一行两个整数:R,m
代表球体的半径与质量
输出描述:
一行实数,代表浮在水面上的高度值,请保留两位小数。