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;
    }
    
  • 相关阅读:
    leetcode 890. 查找和替换模式 Python
    TensorFlow-GPU+cuda8+cudnn6+anaconda安装遇到的版本错误
    leetcode 921. 使括号有效的最少添加(Python)
    BFC概念详解及应用
    做一个网页阅读百分比指示器
    margin-bottom和vertical-align的区别
    MD5算法
    Array.prototype.slice.call()方法详解
    String stringbuffer StringBuilder
    价值观
  • 原文地址:https://www.cnblogs.com/liulangye/p/2508730.html
Copyright © 2011-2022 走看看