有错误或不准确的二叉搜索

Binary search with bug or inaccuracy

本文关键字:搜索 不准确 有错误      更新时间:2023-10-16

首先,对不起我的英语。

我正在解决这个问题:

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

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

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

这是我的代码:

#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("%.3fn", binarySearch(0.0, minVolume * minVolume * minVolume * VC, k + 1, n, v));
    return 0;
}

问题是我在二进制搜索中将最小音量设置为高,但我应该使用最大音量。第二个问题是我没有将最大半径 ^ 3 传递给二叉搜索函数。感谢您的帮助