hdu 4033

 

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;

const int MAXN = 105;
const double eps = 1e-4;
double dis[MAXN];
const double pi = acos ( -1.0 );

int n;
int bsearch (  double len )
{
    double ang = 0.0;
    for ( int i = 0 ; i < n ; i ++)
    {
        if ( dis[i] + dis[(i+1)%n] <= len || fabs(dis[i] + dis[(i+1)%n] - len ) < eps  ) return 1;
        if ( dis[i] - dis[(i+1)%n] >= len || fabs(dis[i] - dis[(i+1)%n] - len ) < eps) return -1;
        double ang2 = acos ( (dis[i]*dis[i] + dis[(i+1)%n]*dis[(i+1)%n] - len*len)/(2*dis[i]*dis[(i+1)%n]) );
        ang += ang2;
        //cout << ang2 << endl;
    }
    //printf("%lf\n" , ang );
    if ( fabs(ang - 2*pi) < eps )   return 0;
    else if ( ang > 2*pi )  return 1;
    else if ( ang < 2*pi )  return -1;
}

int main()
{
    int Case;
    //printf("%.15lf" , pi );
    scanf("%d", &Case );
    for ( int k = 1 ; k <= Case ; k ++ )
    {
        scanf("%d" , & n );
        for ( int i = 0 ; i < n; i ++)
            scanf("%lf", &dis[i]);
        double begin = 0;
        double end = 10000.0;
        double mid ;
        for ( int i = 0 ; i < 100; i ++ )
        {
            mid = (begin + end)/2.0;
            //cout << mid << endl;
            int result = bsearch ( mid );
            if ( result == 1 )
                end = mid;
            else if ( result == -1 )
                begin = mid;
            else if ( result == 0 )
                break;
        }
        printf("Case %d: " , k );
        //cout << mid << endl;
        if ( bsearch ( mid ) != 0 )
            printf("impossible\n");
        else
        {
            printf("%.3lf\n" , mid );
        }
    }
    return 0;
}

 

精度的问题 , 判断大于等于的时候要加上等于的特判 精度就能提高很多 用1e-5 就能过..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值