这题关键点就是把所有的交点全求出来 然后因为每4个交点组成一个四边形,根据叉积求面积,然后枚举出最大值
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#define eps 0.01
#define pi 3.1415926
using namespace std;
struct pot {
double x, y;
pot() {};
pot(double _x, double _y): x(_x), y(_y) {};
pot operator-(pot pt) {
return pot(x - pt.x, y - pt.y);
}
double operator*(pot pt) {
return (x * pt.y - y * pt.x);
}
} pots[40][40];
double getdis(double x1, double y1, double x2, double y2) {
return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}
struct seg {
pot p1, p2;
pot crossedPt(seg sg) {
pot p3 = sg.p1;
pot p4 = sg.p2;
double dis = getdis(p1.x, p1.y, p2.x, p2.y);
double d1 = fabs((p2 - p1) * (p3 - p1)) / dis;
double d2 = fabs((p2 - p1) * (p4 - p1)) / dis;
double t = d1 / (d1 + d2);
pot p = p4 - p3;
return pot(p3.x + t * p.x, p3.y + t * p.y);
}
};
seg hor[40], ver[40];
int main() {
int n, i, j;
double ans, area;
while (scanf("%d", &n) && n) {
//a
for (i = 1; i <= n; i++) {
scanf("%lf", &ver[i].p1.x);
ver[i].p1.y = 0;
}
//b
for (i = 1; i <= n; i++) {
scanf("%lf", &ver[i].p2.x);
ver[i].p2.y = 1;
}
//c
for (i = 1; i <= n; i++) {
scanf("%lf", &hor[i].p1.y);
hor[i].p1.x = 0;
}
//d
for (i = 1; i <= n; i++) {
scanf("%lf", &hor[i].p2.y);
hor[i].p2.x = 1;
}
hor[0].p1.x = 0;
hor[0].p1.y = 0;
hor[0].p2.x = 1;
hor[0].p2.y = 0;
hor[n + 1].p1.x = 0;
hor[n + 1].p1.y = 1;
hor[n + 1].p2.x = 1;
hor[n + 1].p2.y = 1;
ver[0].p1.x = 0;
ver[0].p1.y = 0;
ver[0].p2.x = 0;
ver[0].p2.y = 1;
ver[n + 1].p1.x = 1;
ver[n + 1].p1.y = 0;
ver[n + 1].p2.x = 1;
ver[n + 1].p2.y = 1;
pot p1, p2, p3, p4;
for (i = 0; i <= n + 1; i++) {
for (j = 0; j <= n + 1; j++) {
pots[i][j] = hor[i].crossedPt(ver[j]);
}
}
ans = 0;
for (i = 1; i <= n + 1; i++) {
for (j = 1; j <= n + 1; j++) {
p1 = pots[i - 1][j - 1];
p2 = pots[i][j - 1];
p3 = pots[i][j];
p4 = pots[i - 1][j];
area = fabs((p2 - p1) * ( p3 - p1) / 2.0) + fabs((p3 - p1) * (p4 - p1) ) / 2.0;
ans = max(ans, area);
}
}
printf("%.6f\n", ans);
}
}