您的位置:首页 > 编程语言 > C语言/C++

搜素算法——二分搜索-1003

2016-04-14 16:03 302 查看
题意:来了f个人,有n个披萨饼,这些披萨饼有着相同的厚度和各自的半径,每个人吃的都是一样的数量,而且不能大家都不想去吃用剩下的边角料留下的披萨,所以就问每个人吃披萨饼的最大量。

用二分搜素,注意精度,误差限,一定要注意1e-
#include <cstdio>

#include <cmath>

#include <iostream>

using namespace std;

const double PI = acos(-1.0);

const double eps = 1e-5;

int n, f;

double r, v[10005];

double maxa = 0;

bool test(double x)

{

    int sum = 0;

    for (int i = 0; i < n; i++)

        sum += int(v[i] / x);

    return sum >= (f + 1);

}

double Bsearch(double l, double r)

{

    while (r - l > eps)

    {

        double mid = (r + l) * 0.5;

        if (test(mid))

            l = mid;

        else r = mid;

    }

    return l;

}

void solve()

{

    scanf("%d%d", &n, &f);

    maxa = 0;

    for (int i = 0; i < n; i++)

    {

        scanf("%lf", &r);

        v[i] = r * r * PI;

        maxa = max(maxa, v[i]);

    }

    double ans = Bsearch(0.0, maxa);

    printf("%.4lf\n", ans);

}

int main()

{

    int t; scanf("%d", &t);

    while (t--)

        solve();

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM C++