您的位置:首页 > 编程语言 > Go语言

2011 Regular Polygon

2015-10-02 19:21 656 查看
题目链接

#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
;

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
= 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

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM