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
*/
#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网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- HDU 1568
- HDU1290