二进制搜索错误或不准确

时间:2015-01-25 09:09:54

标签: c++ algorithm binary-search floating-accuracy

首先,对不起我的英语。

我正在解决这个问题:

  汤姆想要从杰瑞的大炮射击,但他希望尽可能多的棋子,但它们必须是相同的尺寸和尽可能大的。他只有 n 炮弹可供他使用,因此他可以将它们切成小块。而且他希望在Jerry的大炮中射击 k + 1 。他知道每个炮弹的半径。一件最大的体积是多少?输出是舍入的printf("%。3f \ n",答案)。第一个数字是 n ,第二个 n ,下一个 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("%.3f\n", binarySearch(0.0, minVolume * minVolume * minVolume * VC, k + 1, n, v));

    return 0;
}

1 个答案:

答案 0 :(得分:0)

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