本题数据量不大 直接求解
先求出所有的交点,再枚举所有四边形的面积
取最大
#include<iostream> #include<cmath> #include<string> #include<algorithm> #include<queue> #include<map> #include<set> #include<cstring> #include<cstdio> using namespace std; const double K=1e-8; const int N=35; struct node { double x,y; }mem[N][N]; int n; void findxy(int i,int j)//求交点的坐标 { double K2=(mem[n+1][j].y-mem[0][j].y)/(mem[n+1][j].x-mem[0][j].x); if(fabs(mem[i][n+1].x-mem[i][0].x)<K)//注意斜率不存在的情况 { mem[i][j].x=mem[i][0].x; mem[i][j].y=(mem[i][j].x-mem[0][j].x)*K2+mem[0][j].y; } else { double K1=(mem[i][n+1].y-mem[i][0].y)/(mem[i][n+1].x-mem[i][0].x); mem[i][j].x=(mem[i][0].x*K1-mem[i][0].y+mem[0][j].y-K2*mem[0][j].x)/(K1-K2); mem[i][j].y=(mem[i][j].x-mem[0][j].x)*K2+mem[0][j].y; } //cout<<mem[i][j].x<<" "<<mem[i][j].y<<endl; } double Large(int i,int j) { double x1=mem[i][j].x-mem[i-1][j-1].x; double y1=mem[i][j].y-mem[i-1][j-1].y; double x2=mem[i][j].x-mem[i][j-1].x; double y2=mem[i][j].y-mem[i][j-1].y; double x3=mem[i][j].x-mem[i-1][j].x; double y3=mem[i][j].y-mem[i-1][j].y; return (fabs(x1*y2-x2*y1)+fabs(x1*y3-x3*y1))/2.0;//将四边形分解成两个三角形,利用叉积求三角形面积 } int main() { while(scanf("%d",&n)!=EOF,n) { mem[0][0].x=0.0;mem[0][0].y=0.0; mem[n+1][0].x=1.0;mem[n+1][0].y=0.0; mem[0][n+1].x=0.0;mem[0][n+1].y=1.0; mem[n+1][n+1].x=1.0;mem[n+1][n+1].y=1.0; for(int i=1;i<=n;++i) { scanf("%lf",&mem[i][0].x);mem[i][0].y=0.0; } for(int i=1;i<=n;++i) { scanf("%lf",&mem[i][n+1].x);mem[i][n+1].y=1.0; } for(int i=1;i<=n;++i) { scanf("%lf",&mem[0][i].y);mem[0][i].x=0.0; } for(int i=1;i<=n;++i) { scanf("%lf",&mem[n+1][i].y);mem[n+1][i].x=1.0; } double ans=0.0; for(int i=1;i<=n+1;++i) { for(int j=1;j<=n+1;++j) { if(i<=n&&j<=n) findxy(i,j); ans=fmax(ans,Large(i,j)); } } printf("%.6f\n",ans); } return 0; }