#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;
}
输入样例1:
4
0 0
10 0
10 10
0 10
输出样例1:14.142136
输入样例2:
3
0 0
6 0
3 10
输出样例2:10.000000
输入样例3:
5
0 0
99999 20000
100000 70000
33344 63344
1 50000
输出样例3:120182.575925
输入样例4:
6
100 350
101 349
6400 3440
6400 3441
1200 7250
1199 7249
输出样例4:6216.717429
你这个最大线段的算法也不对啊,样例2的最大值明显不是10。
你把所有double 计算都用变量计算,否则可能会转成INT
例如
return fabs(s/2);
改成
double doubletemp=2;
return fabs(s/doubletemp);