hdu 4033 Regular Polygon(2011成都网络赛)

//正多边形内有一点

//给出这点到多边形各个顶点的距离

//求这个多边形的边长

//比赛时瞎了,各种精度

 

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <algorithm>
using namespace std;
#define NUM_INF 0xFFFFFFFF
const double eps = 1e-10;

double m[110][2];
int n;

const double Pi =  acos(-1.0);

int jud(double mid)
{
 double sum;
 sum = 0.0;
 int i;
 double temp;
 
 for(i=0;i<n;i++)
 {
  if(mid>(m[i][0]+m[i][1])-eps) return 1;
  if(mid<fabs(m[i][0]-m[i][1])+eps) return -1;
  temp = (m[i][0]*m[i][0]+m[i][1]*m[i][1]-mid*mid)/(2.0*m[i][0]*m[i][1]);
  sum += acos(temp);
 }


// printf("%.8lf %.8lf\n",mid,sum);
 
 
 if(sum-Pi*2.0> eps)0
  return 1;
 if(sum-Pi*2.0< -eps)
  return -1;
 else
  return 0;
}

int main()
{
 int i;
 int t;
 
//  freopen("a.out", "w", stdout);
 int cases = 0;
 double l,r,temp;
 r = 100000;
 l = -1000;
 scanf("%d",&t);
 while(t--)
 {
  cases++;
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
   scanf("%lf",&m[i][1]);
   m[i+1][0] = m[i][1];
  }
  
  m[0][0] = m[n][0];
  
  
  
  

//  printf("%d\n",jud(6.676));
  
  
  bool flat = false;
  double mid;
  int temp1;

  l = 0;
  r = 20000;
  while((r-l)>eps)
  {
   mid = (r+l)/2.0;
   temp1 = jud(mid);
   if(temp1==0)
   {
    flat  =  true;
    break;
   }
   if(temp1<0)
    l = mid;
   else
    r= mid;
  }
  
  
  if(!flat)
   printf("Case %d: impossible\n",cases);
  else
   printf("Case %d: %.3lf\n",cases,mid);
  
 }
 
 return 0;
}

你可能感兴趣的:(hdu 4033 Regular Polygon(2011成都网络赛))