zoukankan      html  css  js  c++  java
  • poj 1408 Fishnet 夜

    本题数据量不大 直接求解

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

    取最大

    #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;
    }
    
  • 相关阅读:
    ****jQuery
    LANMPS 一键PHP环境安装包(转)
    微信支付授权目录填写规则
    ***四种参数传递的形式——URL,超链接,js,form表单
    WDCP控制面板安装卸载
    html meta标签使用总结(转)
    适合wordpress中文网站的seo优化插件 DX-Seo
    事件驱动框架(二)——状态机【转】
    深入剖析变长参数函数的实现【转】
    Makefile经典教程(一个很棒很清晰的讲解)【转】
  • 原文地址:https://www.cnblogs.com/liulangye/p/2508730.html
Copyright © 2011-2022 走看看