#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define pi acos(-1.0)
#define N 100 + 10
#define eps 1e-6
int n;
double a[N];
int cmp(double x)
{
if(fabs(x) < eps) return 0;
return x > 0 ? 1 : -1;
}
int check(double x)
{
double sum = 0;
for(int i = 0; i < n; i++)
{
if(cmp(a[i] + a[i + 1] - x) <= 0) return 1;
if(cmp(a[i] + x - a[i + 1]) <= 0 || cmp(a[i + 1] + x - a[i]) <= 0) return -1;
sum += acos((a[i] * a[i] + a[i + 1] * a[i + 1] - x * x) / (2 * a[i] * a[i + 1]));
}
int tmp = cmp(sum - 2 * pi);
if(tmp == 0) return 0;
return tmp > 0 ? 1 : -1;
}
int main()
{
int kase = 0, _T;
scanf("%d", &_T);
while(_T--)
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%lf", &a[i]);
a[n] = a[0];
double l = 0.0, r = 20000;
int flag = 0; double ans;
// for(int i = 0; i < 100; i++)
// {
// double mid = (l + r) / 2;
// int t = check(mid);
// if(t == 0)
// {
// flag = 1;
// ans = mid;
// break;
// }
// if(t > 0) r = mid;
// else l = mid;
// }
while(cmp(r - l) > 0)
{
double mid = (l + r) / 2;
int t = check(mid);
if(t == 0)
{
flag = 1;
ans = mid;
break;
}
if(t > 0) r = mid;
else l = mid;
}
printf("Case %d: ", ++kase);
if(!flag) printf("impossible\n");
else printf("%.3f\n", ans);
}
return 0;
}
/*
2
3
3.0 4.0 5.0
3
1.0 2.0 3.0
*/
2011 Regular Polygon
最新推荐文章于 2019-04-16 21:27:27 发布