HDU 4932 Miaomiao's Geometry

学长把这道题放在二分专题里。。。尝试用二分做。。
然后在别人的博客上看到大家都说枚举。。
但是在杭电的discuss里面看到了别人二分ac但是有缺陷的代码
觉得自己也可以用二分实现。。结果总共卡了1天半。。
最后在别人的博客上看到数据0,1,5,6,10。。虽然自己的代码还是瞎猫似的得出来正确答案,但是顿时明白了二分会漏掉答案的真相!!!

因为mid的左和右都有存在答案的可能。。比如0,1,5,6,10。。
2是假答案,3不是,4是真答案。。如果我们二分到3时,便无法判断是right=mid-1,还是left=mid+1。。

所以还是用枚举,其实看看数据,就知道这题的数据量不大,不用担心超时。。

#include<stdio.h>
#include<algorithm>
using namespace std;
double a[233333];
double interval[233333];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        int i;
        for(i=1;i<=n;i++)
            {
                scanf("%lf",&a[i]);
            }
        sort(a+1,a+n+1);
        int cin=0;
        for(i=1;i<n;i++)
            {
                interval[++cin]=a[i+1]-a[i];
                interval[++cin]=interval[cin-1]/2;
            }
        sort(interval+1,interval+cin+1);
        int ans=1;
        for(int j=1;j<=cin;j++)
        {
            int flag=1;
            double old=a[1];
            for(i=2;i<n;i++)
            {
               double zuo=a[i]-interval[j];
               double you=a[i]+interval[j];
               if(zuo>=old)
               {
                   old=a[i];
               }
               else if(you<=a[i+1])
               {
                   old=you;
                   if(a[i+1]==you)
                    i++;
               }
               else
               {
                   flag=0;
                   break;
               }
            }
            if(flag==1)
            {
                ans=j;
            }
        }
        printf("%.3f\n",interval[ans]);
    }
    return 0;
}

你可能感兴趣的:(hdu-暴力枚举)