HDOJ 4033 二分

今天的成都区域赛又悲剧了,通过这三次的区域赛,让我深深的感觉到了我们与别的队的差距。努力了三场,连区预赛都进不了,何况是今年的湖南省省赛呢。那么多前面的队伍在,让我感受到了深深的挫败感啊!今年想拿省赛的一等奖看来是没有希望了,对不起郭神牛了,他的最后一次比赛不能让他圆梦了。真是伤心啊。

今天的二分题,我很早就出思路了,只可惜一直都在WA,不然的话成绩会好很多吧。两个小时能做出3个题的。后面两个小时大家加把油,4个题还是可以的。可惜了。我的1003这个程序直到比赛最后也没有弄出来,比赛的最后一次提交没有交上去,否则这个题还是可以过的。所以以后千万不能丧失信心,要奋战到底不罢休!!

这个题用二分,二分边长,然后会得出内角和。内角和为二分的标准。就是这样。不过我的二分还是有很多漏洞,对于impossible的情况判断简直是2B了!卡死卡死卡死!!最后面的2PI和内角和的判断没有想到竟然是这种情况,可能是acos的得精度问题吧!边的精度和角的精度不一样,卡死卡死了!


#include<iostream>
#include<cmath>
#define PI acos(-1.0)
#define eps 1e-6
#define MAXN 101
using namespace std;

int main()
{
    int index=1;
    double date[101];
    int T,n;
    scanf( "%d",&T );
    while( T-- )
    {
           int i;
           int cnt=0;
           memset( date,0,sizeof(date) );
           double max,min;
           min=100000000000ll;
           max=0;
           scanf( "%d",&n );
           for( i=0;i<n;i++ )
           {    
                scanf( "%lf",&date[i] );
                if( date[i]==0 )
                    date[i]=eps/10;
           }
           for( i=0;i<n;i++ )
           {
                if( max<fabs( date[i]-date[(i+1+n)%n]) )
                    max=fabs( date[i]-date[(i+1+n)%n]);
                if( min>date[i]+date[(i+1+n)%n] )
                    min=date[i]+date[(i+1+n)%n];
           } 
           //printf( "min:%lf max:%lf\n",min,max );
           double L=max;
           double R=min;
           if( L>R )
           {
               printf( "Case %d: impossible\n",index++ );
               continue;
           }
           double m;
           double arc=0;
           while( !(fabs(R-L)<eps) )
           {
                  m=(L+R)/2;
                  arc=0;
                  for( i=0;i<n;i++ )
                        arc+=acos( (date[i]*date[i]+date[(i+1)%n]*date[(i+1)%n]-m*m)/(2*date[i]*date[(i+1)%n]) );
                  if( arc>=2*PI ) R=m;
                  else L=m;
           }
           //printf( "%lf\n",arc );
           //printf( "%lf\n",2*PI );
           if( fabs(arc-2*PI)<eps*10 )
               printf( "Case %d: %.3lf\n",index++,m );
           else
               printf( "Case %d: impossible\n",index++ );
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值