平分凸多边形面积的线段有无数条,求其中最长的线段长度。第一行是凸多边形的顶点数n (3<=n<=5000),接下来是n行顶点坐标,按逆时针顺次输入。我的代码第四个样例差一点点,哪里有问题啊


#include<stdio.h>
#include<math.h>
struct point
{
    double x,y;
}a[5003],O;
double squre(point i,point j,point k)
{
    double s;
    s=i.x*j.y-i.x*k.y+j.x*k.y-j.x*i.y+k.x*i.y-k.x*j.y;
    return fabs(s/2);
}
double dist(point i,point j)
{ return sqrt((i.x-j.x)*(i.x-j.x)+(i.y-j.y)*(i.y-j.y));
}
int main()
{
    int n,i,i1,i2,i3;
    double s,t,k,len=0,max;
    scanf("%d",&n);
    for(i=0;i<n;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
    a[n]=a[0];
    s=0; 
    for(i=0;i<n;i++) s+=fabs(a[i].x*a[i+1].y-a[i+1].x*a[i].y);
    s=s/4; //接下来的s为面积的一半 _finished_
    max=0;
    for(i=0;i<n;i++)
    {
        t=0;
        i1=i;
        while(1)
        {
            i2=(i1+1)%n; 
            i3=(i2+1)%n;
            t+=squre(a[i],a[i2],a[i3]);
            if(t>=s) break;    
            i1++;
        }
        //printf("%lf",t);
        k=(t-s)/squre(a[i],a[i2],a[i3]);//printf("%lf\n",k);
        O.x=a[i3].x+(a[i2].x-a[i3].x)*k;
        O.y=a[i3].y+(a[i2].y-a[i3].y)*k; //printf("%lf %lf",O.x,O.y);
        len=dist(O,a[i]);//printf("%lf\n",len);
        if(len>max){
        max=len;
        }
    }
    printf("%lf",max);
    return 0;
}
输入样例14 
0 0 
10 0 
10 10 
0 10
输出样例114.142136

输入样例23 
0 0 
6 0 
3 10
输出样例210.000000

输入样例35 
0 0 
99999 20000 
100000 70000 
33344 63344 
1 50000
输出样例3120182.575925

输入样例46 
100 350 
101 349 
6400 3440 
6400 3441 
1200 7250 
1199 7249
输出样例46216.717429

你这个最大线段的算法也不对啊,样例2的最大值明显不是10。

你把所有double 计算都用变量计算,否则可能会转成INT
例如
return fabs(s/2);
改成
double doubletemp=2;
return fabs(s/doubletemp);