1 /* 2 LA2402: 3 题意:在矩形中给定横线(竖)之间不交叉的n对线,求被分割的小块的最大面积 4 读懂题意就可以发现是思路很简单的题目 5 枚举+几何计算,时间复杂度度不高 6 熟悉了部分函数的运用 7 8 */ 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 #include <math.h> 13 #include <ctype.h> 14 #include <string> 15 #include <iostream> 16 #include <sstream> 17 #include <vector> 18 #include <queue> 19 #include <stack> 20 #include <map> 21 #include <list> 22 #include <set> 23 #include <algorithm> 24 25 using namespace std; 26 27 struct Point 28 { 29 double x,y; 30 Point(double x=0,double y=0):x(x),y(y){} 31 void print() 32 { 33 cout<<"("<<x<<","<<y<<")"<<endl; 34 } 35 }; 36 37 typedef Point Vector; 38 39 Vector operator-(Point A,Point B)//表示A指向B 40 { 41 return Vector(A.x-B.x,A.y-B.y); 42 } 43 Vector operator*(Vector A,double k) 44 { 45 return Vector(A.x*k,A.y*k); 46 } 47 Vector operator+(Point A,Point B)//表示A指向B 48 { 49 return Vector(B.x+A.x,B.y+A.y); 50 } 51 double Cross(Vector A,Vector B) {return A.x*B.y-A.y*B.x;} 52 double Area(Point A,Point B,Point C)//三角形面积 53 { 54 return fabs(Cross(B-A,C-A))/2; 55 } 56 struct Line 57 { 58 Point p; 59 Vector v; 60 Line(Point p,Vector v):p(p),v(v){} 61 }; 62 Line Getline(Point A,Point B)//求直线AB 63 { 64 Vector u=A-B; 65 return Line(A,u); 66 } 67 Point InterSection(Line L1,Line L2)//求直线交点 68 { 69 Vector u=L1.p-L2.p; 70 double t=Cross(L2.v,u)/Cross(L1.v,L2.v); 71 return L1.p+L1.v*t; 72 } 73 double a[50],b[50],c[50],d[50]; 74 int n; 75 int main() 76 { 77 while(cin>>n) 78 { 79 if(!n) break; 80 for(int i=1;i<=n;i++) cin>>a[i]; 81 for(int i=1;i<=n;i++) cin>>b[i]; 82 for(int i=1;i<=n;i++) cin>>c[i]; 83 for(int i=1;i<=n;i++) cin>>d[i]; 84 a[0]=0;b[0]=0;c[0]=0;d[0]=0; 85 a[n+1]=1;b[n+1]=1;c[n+1]=1;d[n+1]=1; 86 double m=-1; 87 for(int i=0;i<=n;i++)//外层枚举相邻的横线 88 { 89 Line L1=Getline(Point(0,c[i]),Point(1,d[i])); 90 Line L2=Getline(Point(0,c[i+1]),Point(1,d[i+1])); 91 for(int j=0;j<=n;j++)//内层枚举相邻的竖线 92 { 93 Line L3=Getline(Point(a[j],0),Point(b[j],1));//一开始写成i,= =! 94 Line L4=Getline(Point(a[j+1],0),Point(b[j+1],1)); 95 Point P1=InterSection(L1,L3); 96 Point P2=InterSection(L1,L4); 97 Point P3=InterSection(L2,L4); 98 Point P4=InterSection(L2,L3); 99 double S=Area(P1,P2,P4)+Area(P2,P3,P4); 100 // P1.print();P2.print();P3.print();P4.print(); 101 // cout<<"A1="<<Area(P1,P2,P4)<<endl; 102 // cout<<"A2="<<Area(P2,P3,P4)<<endl; 103 // cout<<"S="<<S<<endl; 104 if (S>m) m=S; 105 } 106 } 107 printf("%.6lf ",m); 108 } 109 return 0; 110 }