#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 就能过..