本题数据量不大 直接求解

先求出所有的交点,再枚举所有四边形的面积

取最大

#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;
}

 

posted on 2012-05-19 11:12  夜->  阅读(156)  评论(0编辑  收藏  举报