二分求 精确度 问题


/*
给你n个蛋糕的半径,你有m个朋友,所以总共有m+1个人,现在要分蛋糕,要求每个人分到的大小都是一样的,且每个人的蛋糕都是从一块上切割下来的(不能是2个不同的蛋糕拼起来的),现在问每个人最多能分到多少蛋糕(体积),保留到小数点后4位输出。

Input
第一行是组数T,接下来是T组数据。
每组数据包含2行,第一行是n和m,均不超过10000,参考描述。
第二行是n个数,每个数表示一个蛋糕的半径,均不超过10000.

Output
对每组数据输出一个数一行,为分到的蛋糕的体积。

Sample Input
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2

Sample Output
25.1327
3.1416
50.2655

Hint
比如第二组
1 24
5
表示有一个半径是5的蛋糕,所以体积是25pi,现在你们有1+24个人分,每人能分到pi
*/


/*

本题是中文化后的题  题意很明白
因为  答案要精确到  4位   因此联想  要使用二分;


坑点 
我编号后  pi值  取3.141592;
答案错误

以后多记几位   3.1415926535898 
*/
#include<stdio.h>
#include<algorithm>
using namespace std;
int pi;
double pi1[10010];
bool cmp(double a,double b)
{
    return a<b;
}
int tt(double x)
{
    int s=0;
    for(int i=0;i<pi;i++)
    {
        s += (int)(pi1[i]/x);
    }
    return s;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        int fir;
        scanf("%d%d",&pi,&fir);
        int s=0;
         for(int j=0;j<pi;j++)
        {
            scanf("%lf",&pi1[j]);
            pi1[j] = pi1[j]*pi1[j]*3.1415926535898;    
        }
        sort(pi1,pi1+pi);
        fir++;
        double r,l,mid;
        r = 0.0;
        l = pi1[pi-1];
        while(l-r>=1e-6)
        {
            mid = (r+l)/2;
            if(tt(mid)>=fir)
                r = mid;
            else if(tt(mid)<fir)
                l = mid;
    
        }
        printf("%.4lf\n",r);
    }
}

猜你喜欢

转载自blog.csdn.net/lijianzhong1/article/details/81267998