(二分)HDU 1969 pie

简单的二分题,注意精度

不知道为什么老是WA

WA代码:

#include <stdio.h>
#include <math.h>
double pi = acos(-1.0);
#define eps 1e-7
int main()
{
    int k,n,f,i,r,count;
    double mid,a[10005],low,up;
    scanf("%d",&k);
    while(k--)
    {
        low=0.0;
        up=0.0;
        scanf("%d%d",&n,&f);
        f+=1;
        for(i=0;i<n;i++)
        {
            scanf("%d",&r);
            a[i]=Pi*r*r;
            if(a[i]>up)
                up=a[i];
        }
        mid=(up+low)/2;
        while(up-low>eps)
        {
            count=0;
            for(i=0;i<n;i++)
                count+=(int)(a[i]/mid);
            if(count>=f)
                low=mid;
            else
                up=mid;
            mid=(up+low)/2;
        }
        printf("%.4lf\n",mid);
    }
    return 0;
}

下面是AC代码

#include <stdio.h>
#include <math.h>
double pi = acos(-1.0);
int F,N,i;
double V[10001];
int test(double x)
{
    int num=0;
    for(i = 0; i < N;i++)
    {
        num += (int)(V[i]/x);
    }
    if(num>=F)
    return 1;
    else return 0;
}
int main()
{
    int t,r;
    double v,max,left,right,mid;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&N,&F);
        F = F+1;
        for(i = 0; i < N; i++)
        {
            scanf("%d",&r);
            V[i] = pi*r*r;
            v += V[i];
        }
        max = v/F;
        left = 0.0;
        right = max;
        while((right-left)>1e-6)//注意这里的精度问题。
        {
            mid = (left+right)/2;
            if(test(mid))
            left = mid;
            else right = mid;
        }
        printf("%.4f\n",mid);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值