Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 1935 | Accepted: 1242 |
Description
Input
Output
Sample Input
2 0.2000000 0.6000000 0.3000000 0.8000000 0.1000000 0.5000000 0.5000000 0.6000000 2 0.3333330 0.6666670 0.3333330 0.6666670 0.3333330 0.6666670 0.3333330 0.6666670 4 0.2000000 0.4000000 0.6000000 0.8000000 0.1000000 0.5000000 0.6000000 0.9000000 0.2000000 0.4000000 0.6000000 0.8000000 0.1000000 0.5000000 0.6000000 0.9000000 2 0.5138701 0.9476283 0.1717362 0.1757412 0.3086521 0.7022313 0.2264312 0.5345343 1 0.4000000 0.6000000 0.3000000 0.5000000 0
Sample Output
0.215657 0.111112 0.078923 0.279223 0.348958 题意:有一个1*1的正方形在四条边上各取n个点,然后求在正方形内围成的最大四边形的面积 思路:用一个矩阵来保存所有的点,四边上每个点是输入的,内部的每个点通过线段交点的计算可以计算出来。 然后枚举任意i-1,i,j-1,j四个点计算四边形的面积,求最大值。在计算四边形面积的时候四边形可以转换成两 个三角形来计算,这两个三角形的面积是通过向量的叉积来计算的。两个向量的叉积可以算出以这两个向量为 邻边的四边形的面积,注意除以2. ac代码:#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #define fab(a) (a)>0?(a):(-a) #define LL long long #define MAXN 2100 #define mem(x) memset(x,0,sizeof(x)) #define INF 0xfffffff #define PI acos(-1.0) using namespace std; struct s { double x,y; }list[MAXN][MAXN]; double dis(s aa,s bb) { return sqrt((aa.x-bb.x)*(aa.x-bb.x)+(aa.y-bb.y)*(aa.y-bb.y)); } double area(s a,s b,s c)//叉积求面积 { return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y); } s fun(s a,s b,s c,s d)//求交点 { s temp=a; double t=((a.x-c.x)*(c.y-d.y)-(a.y-c.y)*(c.x-d.x))/((a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x)); temp.x+=(b.x-a.x)*t; temp.y+=(b.y-a.y)*t; return temp; } void intn(int n) { double a; int i,j; list[0][0].x=0,list[0][0].y=0; list[0][n+1].x=1.0,list[0][n+1].y=0.0; list[n+1][n+1].x=1.0,list[n+1][n+1].y=1.0; list[n+1][0].x=0.0,list[n+1][0].y=1.0; for(i=1;i<=n;i++){ scanf("%lf",&a); list[0][i].x=a,list[0][i].y=0.0; } for(i=1;i<=n;i++){ scanf("%lf",&a); list[n+1][i].x=a,list[n+1][i].y=1.0; } for(i=1;i<=n;i++){ scanf("%lf",&a); list[i][0].x=0.0,list[i][0].y=a; } for(i=1;i<=n;i++){ scanf("%lf",&a); list[i][n+1].x=1.0,list[i][n+1].y=a; } } int main() { int n,i,j; while(scanf("%d",&n)!=EOF,n) { intn(n); for(j=1;j<=n;j++) { for(i=1;i<=n;i++) { list[i][j]=fun(list[0][j],list[n+1][j],list[i][0],list[i][n+1]); } } double M=0.0,ans; for(i=1; i<=n+1; i++) { for(j=1; j<=n+1; j++) { ans=fab(area(list[i-1][j-1],list[i][j],list[i][j-1])); ans+=fab(area(list[i-1][j-1],list[i][j],list[i-1][j])); ans/=2; M=max(M,ans); } } printf("%.6lf\n",M); } return 0; }