参考博客:

用向量积求线段焦点证明:

首先,我们设 (AD向量 × AC向量) 为 multi(ADC) ; 那么 S三角形ADC = multi(ADC)/2 。

由三角形DPD1 与 三角形CPC1 相似;可得 |DP| / |PC| = |DD1| / |CC1| = multi(ADB) × multi(ACB) 。

|DP| / |PC| = (xD - xP) / (xP - xC) = (yD - yP) / (yP - yC) 。

xP = ((multi(D,B,A) * xC - multi(C,B,A) * xD)) / (multi(D,B,A) - multi(C,B,A));

yP = ((multi(D,B,A) * yC - multi(C,B,A) * yD)) / (multi(D,B,A) - multi(C,B,A));

题目不难,大致题意为:

给定一个单位矩阵,并在每条边上面“嵌入”n个点,这样每条边共有n+2个点。将单位矩阵对面相应位置的点连接起来,构成n*n个不规则四边形。要求出这n*n个矩阵中面积的最大值。

简单的模拟+叉积求三角形面积+不规则四边形划分成三角形求面积。

枚举每个四边形,将每个四边形划分为2个三角形。利用三角形求面积公式计算面积。比较求出最大面积。

那么关键点在于如何求三角形面积。

下面提供2中方法:

1)解析几何:

海伦公式: S=p*(p-a)*(p-b)*(p-c)取根号,其中p=(a+b+c)/2;

2)计算几何方法

S=1/2*| ac向量 叉乘 ab向量|

显然,计算几何方法更快,且精度更高(没有根号),代码也少,而且在求线段交点的过程中也会用到叉乘。一举两得

另外在模拟的过程中,要格外小心,因为很多细节要注意。
代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
using namespace std;
const int max_=;
typedef struct point{
double x;
double y;
}point;
point node[max_][max_];
double det(double x1,double y1,double x2,double y2)
{
return x1*y2-x2*y1;
}
double cross(point A,point B,point P)//AB,AP的叉乘
{
return det(B.x-A.x,B.y-A.y,P.x-A.x,P.y-A.y);
}
void intersection(point A,point B,point C,point D,int i,int j)//两线段的交点坐标
{
double nulti1=cross(A,B,C);
double nulti2=cross(A,B,D);
//printf("%lfok\n",nulti1);
node[i][j].x=(nulti2*C.x-nulti1*D.x)/(nulti2-nulti1);
node[i][j].y=(nulti2*C.y-nulti1*D.y)/(nulti2-nulti1);
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
node[][].x=0.0,node[][].y=1.0;
node[][n+].x=1.0,node[][n+].y=1.0;
node[n+][].x=0.0,node[n+][].y=0.0;
node[n+][n+].x=1.0,node[n+][n+].y=0.0;
for(int i=;i<=n+;i++)
{
scanf("%lf",&node[n+][i].x);
node[n+][i].y=0.0;
}
for(int i=;i<=n+;i++)
{
scanf("%lf",&node[][i].x);
node[][i].y=1.0;
}
for(int i=n+;i>=;i--)
{
scanf("%lf",&node[i][].y);
node[i][].x=0.0;
}
for(int i=n+;i>=;i--)
{
scanf("%lf",&node[i][n+].y);
node[i][n+].x=1.0;
}
for(int i=;i<=n+;i++)
for(int j=;j<=n+;j++)
{
intersection(node[i][],node[i][n+],node[][j],node[n+][j],i,j);
}
double maxm=-1.0;
for(int i=;i<=n+;i++)
for(int j=;j<=n+;j++)//两三角形面积和
{
double temp=fabs(cross(node[i][j],node[i+][j],node[i][j+]))*0.5+
fabs(cross(node[i+][j+],node[i+][j],node[i][j+]))*0.5;
if(maxm<temp)
maxm=temp;
// printf("ok\n");
}
printf("%.6lf\n",maxm);
/* for(int i=2;i<=n+1;i++){
for(int j=2;j<=n+1;j++)
printf("%lf ",node[i][j].x);
printf("\n");
}*/
}
}

几何问题 poj 1408的更多相关文章

  1. POJ 1408 Fishnet【枚举+线段相交+叉积求面积】

    题目: http://poj.org/problem?id=1408 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...

  2. 简单几何(凸包) POJ 1696 Space Ant

    题目传送门 题意:一个蚂蚁一直往左边走,问最多能走多少步,且输出路径 分析:就是凸包的变形题,凸包性质,所有点都能走.从左下角开始走,不停排序.有点纠结,自己的凸包不能AC.待理解透凸包再来写.. 好 ...

  3. 简单几何(凸包) POJ 1113 Wall

    题目传送门 题意:求最短路线,使得线上任意一点离城堡至少L距离 分析:先求凸包,答案 = 凸包的长度 + 以L为半径的圆的周长 /*********************************** ...

  4. 简单几何(凸包) POJ 2187 Beauty Contest

    题目传送门 题意:求两点的距离平方的最大值 分析:凸包模板题 /************************************************ * Author :Running_T ...

  5. Fishnet(暴力POJ 1408)

    Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1911   Accepted: 1227 Descripti ...

  6. 两条线段求交点+叉积求面积 poj 1408

    题目链接:https://vjudge.net/problem/POJ-1408 题目是叫我们求出所有四边形里最大的那个的面积. 思路:因为这里只给了我们正方形四条边上的点,所以我们要先计算横竖线段两 ...

  7. POJ 1408:Fishnet

    Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1921   Accepted: 1234 Descripti ...

  8. poj很好很有层次感(转)

    OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...

  9. POJ题目分类推荐 (很好很有层次感)

    著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299 ...

随机推荐

  1. Windows10下运行Android Studio3.3时关于AMD处理器不支持Intel硬件加速的解决办法

    我的电脑是Thinkpad E485系列,CPU是AMD Ryzen 5 2500U,电脑预装系统是Windows10 X64家庭版,如下图所示: 下载安装了Android Studio3.3,创建了 ...

  2. Spring入门之生命周期

    好几日没有读东西了,今天本来要读mybatis原理部分,但是看到作者讲,只是学会用不用学那么深,遂直接开干spring,工作中一直用springboot,框架都是领导搭好的,每天的任务就是增删改查,挺 ...

  3. 关于软件IntelliJ IDEA的使用技巧(四)

    二,IntelliJ IDEA的工具栏介绍 2,IntelliJ IDEA菜单栏 (9)Run运行 ✌1.Run'All Features in :src':运行scr中所有的特征 ✌2.Debug  ...

  4. qs.parse()、qs.stringify()使用方法, 以及在axios 中怎么用?

    最近一直被纠结于传输格式,就在这里整理一下吧. qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装.   (axios 自带qs , // import qs from ' ...

  5. 查看linux防火墙的状态

    如有需要可以加我Q群[308742428]大家一起讨论技术,有偿服务. 后面会不定时为大家更新文章,敬请期待. 喜欢的朋友可以关注下.iptables防火墙1.基本操作 # 查看防火墙状态 servi ...

  6. Nodejs入门级基础+实战

    这篇随笔将会按序记录如下内容: NodeJs 简介 安装  NodeJs HTTP 模块.URL 模块 CommonJs 和 Nodejs 中自定义模块 NodeJs FS 模块 利用 HTTP 模块 ...

  7. this 的指向问题

    1.全局作用域或者普通函数中 this 指向全局对象 window ( 定时器里面的this 指向 window ) 1.1 console.log(this); // window 1.2 func ...

  8. 第1篇Kubernetes介绍

      一.Kubernetes 介绍:     kubernetes起源 Kubernetes (K8s) 是 Google 在 2014 年发布的一个开源项目. 据说 Google 的数据中心里运行着 ...

  9. 简单记录下Jmeter通过CSV保存测试数据,测试用例,及将测试结果导出到Excel里

    1.CSV保存测试数据,并上传到CSV Data Set Config,设置相关属性 2.CSV保存测试用例,并上传到CSV Data Set Config,设置相关属性 3.设置一个http请求,设 ...

  10. Java多线程常用方法的使用

    Java多线程的常用方法基本分为:获取当前线程的操作,线程休眠sleep()方法,线程让步yield()方法,等待其他线程终止join()方法,线程停止的一系列方法. 一.获取当前线程的操作   1. ...