hdu 4033 Regular Polygon (二分)++++++

<a href="http://acm.hdu.edu.cn/showproblem.php?pid=4033">http://acm.hdu.edu.cn/showproblem.php?pid=4033</a> 

思路:二分  
  先找 两边之和的最小max 和两边只差的最大 min 则边的长度 L 必然 min<l<max 
  然后二分求解
 注意啊,一开始定义 eps 是为e-6,wa 改为e-8 ac 
 
#include<stdio.h>
#define N 1000
#include<math.h>
#define eps 1e-8
const double pi=2*acos(-1);
double a[N];
int main()
{
    int T,l,i,n;
    scanf("%d",&T);
    for(l=1;l<=T;l++)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
          scanf("%lf",&a[i]);
          a[n+1]=a[1];
          double min=-1,max=9999999;
          for(i=1;i<=n;i++)
          {
              double  temp=a[i]+a[i+1];
              if(max>temp)max=temp;
              temp=fabs(a[i]-a[i+1]);
              if(min<temp)min=temp;
              //printf("%lf %lf  12122\n",min,max);
          }
          int f=0;
          double mid;
 
          while(max-min>eps)
          {
 
               mid=(min+max)/2;
              double sum=0;
              for(i=1;i<=n;i++)
              {
                  sum+=acos((a[i]*a[i]+a[i+1]*a[i+1]-mid*mid)/(2*a[i]*a[i+1]));
              }
              //printf("%lf %lf\n",sum,pi);
              if(fabs(pi-sum)<=eps)
              {
 
                  f=1;
                  break;
              }
              else
              if(sum-pi>eps)
              {
                  max=mid;
              }
              else
              if(pi-sum>eps)
              {
                  min=mid;
 
              }
 
          }
          if(f)printf("Case %d: %.3lf\n",l,mid);
          else printf("Case %d: impossible\n",l);
    }
}

  

posted @ 2012-04-05 20:45  Szz  阅读(175)  评论(0编辑  收藏  举报