POJ 1408 Fishnet【枚举+线段相交+叉积求面积】
题目:
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 1604 | Accepted: 1026 |
Description
him. He found a square wood-frame and a long thread among the wrecks. He had to survive in this island until someone came and saved him.
In order to catch fish, he began to make a kind of fishnet by cutting the long thread into short threads and fixing them at pegs on the square wood-frame. He wanted to know the sizes of the meshes of the fishnet to see whether he could catch small fish as well
as large ones.
The wood frame is perfectly square with four thin edges on meter long: a bottom edge, a top edge, a left edge, and a right edge. There are n pegs on each edge, and thus there are 4n pegs in total. The positions of pegs are represented by their (x,y)-coordinates.
Those of an example case with n=2 are depicted in figures below. The position of the ith peg on the bottom edge is represented by (ai,0). That on the top edge, on the left edge and on the right edge are represented by (bi,1), (0,ci) and (1,di), respectively.
The long thread is cut into 2n threads with appropriate lengths. The threads are strained between (ai,0) and (bi,1),and between (0,ci) and (1,di) (i=1,...,n).
You should write a program that reports the size of the largest mesh among the (n+1)2 meshes of the fishnet made by fixing the threads at the pegs. You may assume that the thread he found is long enough to make the fishnet and the wood-frame is thin enough
for neglecting its thickness.
Input
n
a1 a2 ... an
b1 b2 ... bn
c1 c2 ... cn
d1 d2 ... dn
you may assume 0 < n <= 30, 0 < ai,bi,ci,di < 1
Output
Sample Input
2
0.2000000 0.6000000
0.3000000 0.8000000
0.1000000 0.5000000
0.5000000 0.6000000
2
0.3333330 0.6666670
0.3333330 0.6666670
0.3333330 0.6666670
0.3333330 0.6666670
4
0.2000000 0.4000000 0.6000000 0.8000000
0.1000000 0.5000000 0.6000000 0.9000000
0.2000000 0.4000000 0.6000000 0.8000000
0.1000000 0.5000000 0.6000000 0.9000000
2
0.5138701 0.9476283
0.1717362 0.1757412
0.3086521 0.7022313
0.2264312 0.5345343
1
0.4000000
0.6000000
0.3000000
0.5000000
0
Sample Output
0.215657
0.111112
0.078923
0.279223
0.348958
Source
题意:
在直角坐标系中,把第一象限的那个单位面积的正方形分成 n*n 个小四边形,
求最大四边形面积
注意:
点的输入顺序【周边上点,都是按照从小到大的顺序输入的】
算法: 枚举+线段求交点+叉积求面积
思路:
存储每一个点【周边的+线段交点】,
然后依次遍历每一个四边形的面积
Code:
/****************************************************************************
C Accepted 208 KB 16 ms C++ 2155 B
题意:
在直角坐标系中,把第一象限的那个单位面积的正方形分成 n*n 个小四边形,
求最大四边形面积 注意:点的输入顺序【周边上点,都是按照从小到大的顺序输入的】 算法:枚举+线段求交点+叉积求面积 思路:存储每一个点【周边的+交点】,
然后依次遍历每一个四边形的面积
******************************************************************************/
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std; const int maxn = 40;
struct Point{
double x,y;
Point() {}
Point(double _x, double _y){
x = _x;
y = _y;
} Point operator + (const Point &B) const {
return Point(x+B.x, y+B.y);
}
Point operator - (const Point &B) const {
return Point(x-B.x, y-B.y);
}
Point operator * (const double &p) const {
return Point(p*x, p*y);
} }p[maxn][maxn];
typedef Point Vector; /** 叉积求面积 */
double Cross(Point A, Point B)
{
return A.x*B.y - A.y*B.x;
} /** 求线段交点 */
Point GetLineIntersection(Point P, Vector v, Point Q, Vector w){
Vector u = P-Q;
double t = Cross(w, u) / Cross(v, w);
return P+v*t;
} /** 根据四个点用叉积求四边形面积 */
double Area(Point a, Point b, Point c, Point d){
return fabs(Cross(c-a,b-a)) / 2.0 + fabs(Cross(c-a,d-a)) / 2.0;
} int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
if(n == 0) break; p[0][0] = Point(0,1); //定位四个顶点
p[0][n+1] = Point(1,1);
p[n+1][0] = Point(0,0);
p[n+1][n+1] = Point(1,0); double a,b,c,d; //依次存储周边的点
for(int i = 1; i <= n; i++) //a
{
scanf("%lf", &a);
p[n+1][i] = Point(a,0);
} for(int i = 1; i <= n; i++)// b
{
scanf("%lf", &b);
p[0][i] = Point(b,1);
} for(int i = n; i >= 1; i--) //c
{
scanf("%lf", &c);
p[i][0] = Point(0,c);
} for(int i = n; i >= 1; i--) //d
{
scanf("%lf", &d);
p[i][n+1] = Point(1,d);
} //求中间的交点
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
p[i][j] = GetLineIntersection(p[i][0], p[i][0]-p[i][n+1], p[n+1][j], p[n+1][j]-p[0][j]);
}
} double ans = 0;
double tmp;
//从上到下、从左到右依次遍历每个四边形
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
tmp = Area(p[i][j],p[i][j+1],p[i+1][j+1],p[i+1][j]);
ans = max(ans,tmp);
}
}
printf("%.6lf\n", ans);
}
return 0;
}
POJ 1408 Fishnet【枚举+线段相交+叉积求面积】的更多相关文章
- POJ 1039 Pipe 枚举线段相交
Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9493 Accepted: 2877 Description ...
- 两条线段求交点+叉积求面积 poj 1408
题目链接:https://vjudge.net/problem/POJ-1408 题目是叫我们求出所有四边形里最大的那个的面积. 思路:因为这里只给了我们正方形四条边上的点,所以我们要先计算横竖线段两 ...
- poj 1066(枚举+线段相交)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6328 Accepted: 2627 Des ...
- POJ 1066 Treasure Hunt(线段相交判断)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4797 Accepted: 1998 Des ...
- poj 3304(直线与线段相交)
传送门:Segments 题意:线段在一个直线上的摄影相交 求求是否存在一条直线,使所有线段到这条直线的投影至少有一个交点 分析:可以在共同投影处作原直线的垂线,则该垂线与所有线段都相交<==& ...
- POJ 1066--Treasure Hunt(判断线段相交)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7857 Accepted: 3247 Des ...
- POJ 1039 直线和线段相交
题意: 题意很好理解,从左边射过来的光线,最远能经过管道到右边多少距离. 分析: 光线一定经过一个上端点和一个下端点,这一点很容易想到.然后枚举上下端点即可 #include <iostream ...
- POJ 2653 Pick-up sticks(线段相交)
题意:给定n个木棍依次放下,要求最终判断没被覆盖的木棍是哪些. 思路:快速排斥以及跨立实验可以判断线段相交. #include<algorithm> #include<cstdio& ...
- [poj 1127]Jack Straws[线段相交][并查集]
题意: 给出一系列线段,判断某两个线段是否连通. 思路: 根据线段相交情况建立并查集, 在同一并查集中则连通. (第一反应是强连通分量...实际上只要判断共存即可, 具体的方向啊是没有关系的..) 并 ...
随机推荐
- 【Python3 爬虫】08_正则表达式(元字符与语法)
元字符表 符号 说明 示例 . 表示任意字符 'abc' >>>'a.c' >>>结果为:'abc' ^ 表示字符开头 'abc' >>> ...
- 【BIEE】19_不齐整维和越级维
不齐整维:没有子节点的维度 越级维:层级维度出现断裂,则称为越级维 下图我们就可以清晰的看出: 首先,我们将表导入到资料库做好与事实表的关联后并建立相应维 以下是按照一般维度创建维后的结果 创建完成之 ...
- js使用ctrl+s保存表单提升用户体验
本质上是监控ctrl+s 然后触发相应事件 <script language="JavaScript"> //Ctrl+s保存 document.onkeydown=f ...
- list操作总结. dict操作及文件操作
1: 列表的操作 help(list) # 列表的帮助,列出所有列表的用法 type(name) # type判断数据类型是列表还是字典或者元组 isinstance("字符", ...
- vue 销毁组件
销毁组件 // get~ 销毁组件 destroyElement() { this.$destroy(true); this.$el.parentNode.removeChild(this.$el); ...
- Sql中的内连接,左连接以及右连接区别
转自:http://pangaoyuan.javaeye.com/blog/713177 有两个表A和表B. 表A结构如下: Aid:int:标识种子,主键,自增ID Aname:varchar 数据 ...
- Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理
Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理 1. 重载包括:普通方法的重载和构造方法的重载 1 1.1. 横向重载”和“纵向重载”1 1.2. 方法签名通过 方法名称,参数 ...
- PhpMyAdmin 配置文件现在需要一个短语密码的解决方法
新版本的PhpMyAdmin 增强了安全性,需要在配置文件设置一个短语密码.否则进入之后会有“配置文件现在需要一个短语密码.”的红色警叹提示. 解决方法: 1.将 phpMyAdmin/librari ...
- ZOJ 3963 Heap Partition set维护。给一个序列,将其划分成尽量少的序列,使每一个序列满足按照顺序构造二叉树,父母的值<=孩子的值。
Heap Partition Time Limit: Seconds Memory Limit: KB Special Judge A sequence S = {s1, s2, ..., sn} i ...
- 【翻译自mos文章】在Oracle GoldenGate中循环使用ggserr.log的方法
在OGG中循环使用ggserr.log的方法: 參考原文: OGG How Do I Recycle The "ggserr.log" File? (Doc ID 967932.1 ...