Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用二元搜索算法逼近圆锥截锥_C++_Math_Binary Search - Fatal编程技术网

C++ 用二元搜索算法逼近圆锥截锥

C++ 用二元搜索算法逼近圆锥截锥,c++,math,binary-search,C++,Math,Binary Search,我正在努力解决这个问题 描述中说,一些朋友有一瓶可乐,他们想把它平分在杯子里,我需要帮助大家把可乐瓶分开 为了解决这个问题,我需要高度h,这样,如果每个杯子都装满了高达h的可乐,那么每个人得到的可乐量是相同的。您可以假设,杯子的容量不需要超过其容量 给我的信息是杯子顶部和底部的半径及其高度 输入说明: 输入的第一行包含一个确定测试用例数量的整数C。每个测试用例从一行开始,该行包含两个整数N和L(1≤ N≤ 100, 1 ≤ L≤ 10^8),小组中的朋友数量和瓶子中的可乐量,单位为毫升。第二行包

我正在努力解决这个问题

描述中说,一些朋友有一瓶可乐,他们想把它平分在杯子里,我需要帮助大家把可乐瓶分开

为了解决这个问题,我需要高度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的高度。打印带小数点后两位的答案

输入示例:

2
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次。@puwi
if(v\u近似==v)
比较浮点值是否相等是一个错误,所有这一切都是由于这些数字的不精确性造成的。你能举一个例子说明它给出错误答案的情况吗?不=(我不知道它在哪里给出了错误的答案。这个问题是这个网站独有的…我在网上找不到任何输入。如果你更改
EPS
,你会得到同样的错误百分比吗?是的。我尝试过这个值0.00000001。即使没有EPS,它也是10%…我做了一个for循环,计算了100次。@puwi
if(v\u近似==v)
比较浮点值是否相等是一个错误,这一切都是由于这些数字的不精确性造成的。