几何问题 poj 1408
用向量积求线段焦点证明:
首先,我们设 (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的更多相关文章
- POJ 1408 Fishnet【枚举+线段相交+叉积求面积】
题目: http://poj.org/problem?id=1408 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
- 简单几何(凸包) POJ 1696 Space Ant
题目传送门 题意:一个蚂蚁一直往左边走,问最多能走多少步,且输出路径 分析:就是凸包的变形题,凸包性质,所有点都能走.从左下角开始走,不停排序.有点纠结,自己的凸包不能AC.待理解透凸包再来写.. 好 ...
- 简单几何(凸包) POJ 1113 Wall
题目传送门 题意:求最短路线,使得线上任意一点离城堡至少L距离 分析:先求凸包,答案 = 凸包的长度 + 以L为半径的圆的周长 /*********************************** ...
- 简单几何(凸包) POJ 2187 Beauty Contest
题目传送门 题意:求两点的距离平方的最大值 分析:凸包模板题 /************************************************ * Author :Running_T ...
- Fishnet(暴力POJ 1408)
Fishnet Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1911 Accepted: 1227 Descripti ...
- 两条线段求交点+叉积求面积 poj 1408
题目链接:https://vjudge.net/problem/POJ-1408 题目是叫我们求出所有四边形里最大的那个的面积. 思路:因为这里只给了我们正方形四条边上的点,所以我们要先计算横竖线段两 ...
- POJ 1408:Fishnet
Fishnet Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1921 Accepted: 1234 Descripti ...
- poj很好很有层次感(转)
OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...
- POJ题目分类推荐 (很好很有层次感)
著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299 ...
随机推荐
- apache2.2.25+tomcat7.0.47集群方案
因为公司项目在线人数的增加,随着现在硬件成本越来越低,大多数的生产环境内存大多都已经达到 16G,尤其最新的阿里云,客户的机器都是配置超高的java主机,但是Java的运行环境,内存使用有限 ,这样就 ...
- join()和split()
一.join()方法 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 如序列为字典,只连接字典里的键 序列里的元素也需要是字符串,如果不为字符串,则会报错 二. ...
- [已解决]报错: Python Scrapy - service_identity(opentype) not working and cannot install
解决:更新安装service_identity pip3 install service_identity --force --upgrade
- java性能调优03
1.java中的四种引用类型(级别由高到低为:强引用,软引用,弱引用和虚引用) 1.1 强引用:默认创建的变量都是强引用,垃圾回收机制不会将其回收,当内存空 间不足,Java虚拟机宁愿抛出OutOfM ...
- 关于导出Excel出现异常的解决办法。:System.UnauthorizedAccessException: 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败
异常信息为:System.UnauthorizedAccessException: 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} ...
- .net Mvc Dapper 方法封装
首先需要添加 NuGet 包 Dapper 以及引用Configuration <connectionStrings> <add name="SqlSrc&quo ...
- dubbo-源码阅读之服务订阅
配置例子 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://w ...
- 【CSS】三栏布局的经典实现
要求:自适应宽度,左右两栏固定宽度,中间栏优先加载: <!DOCTYPE html> <html> <head> <title>layout</t ...
- 笔记67 Spring Boot快速入门(七)
SpringBoot+RESTful+JSON 一.RESTful架构 REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. ...
- Application.mk语法解释(转)
转自:http://blog.csdn.net/roland_sun/article/details/46318893 Application.mk是用来描述你的应用程序需要哪些模块,以及这些模块所要 ...