C++ 用二元搜索算法逼近圆锥截锥
我正在努力解决这个问题 描述中说,一些朋友有一瓶可乐,他们想把它平分在杯子里,我需要帮助大家把可乐瓶分开 为了解决这个问题,我需要高度h,这样,如果每个杯子都装满了高达h的可乐,那么每个人得到的可乐量是相同的。您可以假设,杯子的容量不需要超过其容量 给我的信息是杯子顶部和底部的半径及其高度 输入说明: 输入的第一行包含一个确定测试用例数量的整数C。每个测试用例从一行开始,该行包含两个整数N和L(1≤ N≤ 100, 1 ≤ L≤ 10^8),小组中的朋友数量和瓶子中的可乐量,单位为毫升。第二行包含三个整数b、b和H(1≤ B≤ B≤ 100, 1 ≤ H≤ 100),较小底座和较大底座的半径,以及杯子的高度,单位为厘米 输出描述: 对于每个测试用例,打印h值,以便所有杯子必须填充到h cm的高度。打印带小数点后两位的答案 输入示例: 2C++ 用二元搜索算法逼近圆锥截锥,c++,math,binary-search,C++,Math,Binary Search,我正在努力解决这个问题 描述中说,一些朋友有一瓶可乐,他们想把它平分在杯子里,我需要帮助大家把可乐瓶分开 为了解决这个问题,我需要高度h,这样,如果每个杯子都装满了高达h的可乐,那么每个人得到的可乐量是相同的。您可以假设,杯子的容量不需要超过其容量 给我的信息是杯子顶部和底部的半径及其高度 输入说明: 输入的第一行包含一个确定测试用例数量的整数C。每个测试用例从一行开始,该行包含两个整数N和L(1≤ N≤ 100, 1 ≤ L≤ 10^8),小组中的朋友数量和瓶子中的可乐量,单位为毫升。第二行包
1200
568
2350
3 3 16 输出示例: 2.40
6.19 我的解决方案 根据问题中给出的数据,有必要找到焦炭量顶部的半径(如平截头体O.O内的平截头体,其中给出的数据对应于外部平截头体) 根据焦炭量的半径,二进制搜索算法可以“猜测”最佳h
#include <stdio.h>
#include <math.h>
#define EPS 0.001
typedef long long lld;
int main(){
lld c,n,l,b,B,H; //names are described in the input
scanf("%lld",&c);
for (lld i = 0; i < c; ++i) {
scanf("%lld %lld %lld %lld %lld",&n,&l,&b,&B,&H);
double v = l/n;//volume expected for each cup
double ini = 0,fim = H, mid = 0.0; //mid will be the 'h'
double v_approximate = 0;
while(fabs(v - v_approximate) > EPS){
mid = (ini + fim)/2.0;
double tmp = b + (B-b)*mid/H; //this is the radius of the coke top
v_approximate = (M_PI*mid/3.0)*(tmp*tmp + tmp*b + b*b);
if(v_approximate == v)
break;
else if(v_approximate > v)
fim = mid;
else
ini = mid;
}
printf("%.2lf\n",mid);
}
}
#包括
#包括
#定义EPS 0.001
typedef-long-long-lld;
int main(){
lld c,n,l,b,b,H;//输入中描述了名称
scanf(“%lld”、&c);
对于(lldi=0;i每股收益){
mid=(ini+fim)/2.0;
双tmp=b+(b-b)*中间/H;//这是焦炭顶部的半径
v_近似值=(M_PI*mid/3.0)*(tmp*tmp+tmp*b+b*b);
如果(v_近似值==v)
打破
否则如果(v_近似值>v)
fim=mid;
其他的
ini=中间;
}
printf(“%.2lf\n”,中间);
}
}
此代码给出10%的错误答案。这是我第一次尝试用近似法来解决数学问题。我遗漏了什么?你能举一个案例,说明它给出了错误的答案吗?不=(我不知道它在哪里给出了错误的答案。这个问题是这个网站独有的…我在网上找不到任何输入。如果你更改
EPS
,你会得到同样的错误百分比吗?是的。我尝试过这个值0.00000001。即使没有EPS,它也是10%…我做了一个for循环,计算了100次。@puwiif(v\u近似==v)
比较浮点值是否相等是一个错误,所有这一切都是由于这些数字的不精确性造成的。你能举一个例子说明它给出错误答案的情况吗?不=(我不知道它在哪里给出了错误的答案。这个问题是这个网站独有的…我在网上找不到任何输入。如果你更改EPS
,你会得到同样的错误百分比吗?是的。我尝试过这个值0.00000001。即使没有EPS,它也是10%…我做了一个for循环,计算了100次。@puwiif(v\u近似==v)
比较浮点值是否相等是一个错误,这一切都是由于这些数字的不精确性造成的。