Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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++_Algorithm_Binary Search_Floating Accuracy - Fatal编程技术网

C++ 带有错误或不准确的二进制搜索

C++ 带有错误或不准确的二进制搜索,c++,algorithm,binary-search,floating-accuracy,C++,Algorithm,Binary Search,Floating Accuracy,首先,对不起我的英语 我正在解决这个问题: 汤姆想用大炮向杰里射击,但他想拥有尽可能多的弹片,但弹片的大小和大小必须尽可能相同。他只有n炮弹供他使用,所以他可以把它们切成小块。他希望有k+1碎片从大炮上射向杰里。他知道每个炮弹的半径。一件最大的体积是多少?输出是四舍五入的printf(“%.3f\n”,答案)。第一个数字是n,第二个数字是k,接下来的n数字是炮弹的半径。 可能的投入: 3 50 1 2 3 产出:2.900* 这是我的解决方案:每一块的体积只能小于或等于最小炮弹的体积,因为你们不

首先,对不起我的英语

我正在解决这个问题:

汤姆想用大炮向杰里射击,但他想拥有尽可能多的弹片,但弹片的大小和大小必须尽可能相同。他只有n炮弹供他使用,所以他可以把它们切成小块。他希望有k+1碎片从大炮上射向杰里。他知道每个炮弹的半径。一件最大的体积是多少?输出是四舍五入的printf(“%.3f\n”,答案)。第一个数字是n,第二个数字是k,接下来的n数字是炮弹的半径。 可能的投入: 3 50 1 2 3 产出:2.900*

这是我的解决方案:每一块的体积只能小于或等于最小炮弹的体积,因为你们不能将炮弹的各个部分连接在一起。因此,我使用了从0.0到最小体积的二进制搜索,作为谓词,我使用了函数numberOfPieces,它计算每个炮弹的碎片数量,每个碎片的具体体积(这是二进制搜索中的中值)。如果我使用中间值作为一件物品的体积,此函数返回我可以获得的物品数量。然后我将它与k+1进行比较,如果它更大或相等,我使用低中值,否则使用高中值我的解决方案适用于此测试输入。

问题是我得到了WA(错误答案),我无法检查测试输入值。你能看看我的代码,看看我是否做错了什么吗?问题可能是数字不准确,但我有小每股收益,所以它应该是好的。提前感谢你的每一个想法

这是我的密码:

#include <vector>
#include <iostream>
#include <algorithm>
#include <stdio.h>

#define PI 3.14159265358979323846
#define VC ((4.0/3.0) * PI) // constant for volume calculation
#define EPS 1E-12

using namespace std;

// return the number of pieces depending on the volume
int numberOfPieces(int v[], int n, double volume)
{
    int ans = 0;
    for(int i = 0; i < n; i++)
        ans += (int)(v[i] * VC / volume);
    return ans;
}


double binarySearch(double a, double b, int k, int n, int v[])
{
   double low = a, high = b;
   while(abs(low-high) > EPS)
   {
      double mid = low + (high - low) / 2.0;
      if(numberOfPieces(v, n, mid) >= k)
          low = mid;
      else
          high = mid;
   }
   return (low + high)/2.0;
}

int main()
{
    int n, k, x; // n - number of cannonballs, k - number of wanted pieces, x - variable for input
    int v[10001]; // radiuses ^ 3 of the cannonballs
    scanf("%d%d", &n, &k);
    int minVolume = 9999999;
    for(int i = 0; i < n; i++) {
        scanf("%d",&x);
        minVolume = min(minVolume, x);
        v[i] = x * x * x;
    }
    printf("%.3f\n", binarySearch(0.0, minVolume * minVolume * minVolume * VC, k + 1, n, v));

    return 0;
}
#包括
#包括
#包括
#包括
#定义PI 3.14159265358979323846
#定义VC((4.0/3.0)*PI)//用于体积计算的常数
#定义EPS 1E-12
使用名称空间std;
//根据体积返回件数
整数件(整数v[],整数n,双卷)
{
int ans=0;
对于(int i=0;iEPS)
{
双中=低+(高-低)/2.0;
if(件数(v,n,mid)>=k)
低=中;
其他的
高=中;
}
回报率(低+高)/2.0;
}
int main()
{
int n,k,x;//n-炮弹数量,k-通缉数量,x-输入变量
int v[10001];//炮弹的半径^3
scanf(“%d%d”、&n和&k);
int minVolume=9999999;
对于(int i=0;i
问题是我在二进制搜索中将最小卷设置为高,但我应该使用最大卷。第二个问题是我没有将最大半径^3传递给二进制搜索函数。感谢您的帮助

您是否尝试调试代码以获取错误答案?至少有一个明显的错误答案是:当您调用
binarySearch
时,应该通过
minVolume*minVolume*minVolume*VC
,其他对meNo来说似乎没问题,我无法给您问题的链接,因为它有点像我大学的家庭作业,会员们只能访问它。是的,这首先是个问题,非常感谢,但当我尝试时,我得到了TLE(超过时间限制),当我尝试更小的EPS=1E-5时,我得到了WA(错误答案)。我在代码中固定了minVolume*minVolume*minVolume。所以我知道了为什么这不起作用,因为举例来说,你可以有十个1000大小的半径和一个1大小的半径,那么我错了,因为我可以只使用十个大的,得到比使用最小体积的全部和最大大小大得多的块。它通过了:D。无论如何,谢谢你的帮助:D