博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2722
阅读量:5987 次
发布时间:2019-06-20

本文共 1230 字,大约阅读时间需要 4 分钟。

题意:给出若干个正方形的边长,和平面直角坐标系中的两条起点在原点的射线(射线上的点表示射线),两条射线在第一象限。要求用这些正方形和这两条射线围成一块封闭的面积,求最大面积。

分析:把正方形对角线连成一条直线,排成一个斜率为-1的直线。这样才能保证面积最大。

所以现在的问题变为,已知两条射线的方向,以及三角形第三条边的斜率(斜率为-1)和长度(正方形边长和×sqrt(2))求三角形的面积(当然最终结果是三角形面积减去正方形面积的一半)

设有a,b两向量,方向是两射线方向,设ka*a为三角形的一条射线上的边,kb×b为三角形另一条射线上的边。(即将两向量适当延长)

延长后两向量的差即为第三条边的向量,由于第三条边斜率为-1,所以其对应向量的横纵坐标相等。且均等于正方形边长之和,设边长之和为a

可得方程:ka * xa - kb * xb = kb * yb - ka * ya = a

我们要求的三角形面积用叉积方法表示为:ka * xa * kb * yb - kb * xb * ka * xa

整理可得最终三角形面积为:a * a * (xa + ya) * (xb + yb) / (xa * yb - xb * ya)

View Code
#include
<
iostream
>
#include
<
cstdio
>
#include
<
cstdlib
>
#include
<
cstring
>
using
namespace
std;
int
n;
void
swap1(
double
&
a,
double
&
b)
{
double
t
=
a;
a
=
b;
b
=
t;
}
int
main()
{
//
freopen("t.txt", "r", stdin);
while
(scanf(
"
%d
"
,
&
n), n)
{
double
xa, ya, xb, yb;
double
a
=
0
, s
=
0
;
scanf(
"
%lf%lf%lf%lf
"
,
&
xa,
&
ya,
&
xb,
&
yb);
if
(ya
/
xa
>
yb
/
xb)
{
swap1(ya, yb);
swap1(xa, xb);
}
for
(
int
i
=
0
; i
<
n; i
++
)
{
double
x;
scanf(
"
%lf
"
,
&
x);
a
+=
x;
s
+=
x
*
x;
}
double
ans
=
((xa
+
ya)
*
a
*
(xb
+
yb)
/
(xa
*
yb
-
xb
*
ya)
*
a
-
s)
/
2
;
printf(
"
%.3f\n
"
, (
double
)ans);
}
return
0
;
}

转载于:https://www.cnblogs.com/rainydays/archive/2011/07/12/2104059.html

你可能感兴趣的文章
jQuery的事件处理方法介绍 - bind(),live(),delegate(),on()
查看>>
继承时有关构造函数要注意的一些问题
查看>>
Spring boot自定义注解方式实现日志记录
查看>>
使用Scrolling来实现无限分页处理
查看>>
PHP特级课视频教程_第十集 Squid透明和反向代理_李强强
查看>>
MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程
查看>>
Babel 转码器
查看>>
java分布式事务处理--最终事务一致性
查看>>
搜索引擎-elasticsearch(一)
查看>>
POODLE漏洞东山再起,影响TLS安全传输协议
查看>>
Android开源中国客户端学习 上拉刷新 底部加载 的listview <4>
查看>>
js 获取radio按钮值的实例
查看>>
webpack4配置详解之逐行逐句分析
查看>>
js各种验证文本框输入格式
查看>>
Hibernate——对象/数据库映射
查看>>
eclipse maven plugin 插件 安装 和 配置
查看>>
王爽《汇编语言》实验7
查看>>
书写具备一致风格、通俗易懂 JavaScript 的原则
查看>>
Maven实战 读书笔记(三)
查看>>
Shiro导致Service/DAO层 AOP切面失效问题
查看>>