题目:



Fishnet
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 1604   Accepted: 1026

Description

A fisherman named Etadokah awoke in a very small island. He could see calm, beautiful and blue sea around the island. The previous night he had encountered a terrible storm and had reached this uninhabited island. Some wrecks of his ship were spread around
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

The input consists of multiple sub-problems followed by a line containing a zero that indicates the end of input. Each sub-problem is given in the following format. 



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

For each sub-problem, the size of the largest mesh should be printed followed by a new line. Each value should be represented by 6 digits after the decimal point, and it may not have an error greater than 0.000001.

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;
}



PS:很简单基础的一道计算几何了,昨天却纠结了很久都没有弄出样例,感觉自己写程序的心态还是很不好,过于心浮气躁,今天早上电脑什么也没开,打开网页和 cb 就直接敲这题,敲了大概半个小时【写程序的速度还是太慢了】,最后总算是一气呵成,1A 了。暑假过了一半了却还没什么进步,acm 生涯也可能就只有这几个月了,而下个月又是最关键的月,加油吧!!!Just do it 












POJ 1408 Fishnet【枚举+线段相交+叉积求面积】的更多相关文章

  1. POJ 1039 Pipe 枚举线段相交

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9493   Accepted: 2877 Description ...

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

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

  3. poj 1066(枚举+线段相交)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6328   Accepted: 2627 Des ...

  4. POJ 1066 Treasure Hunt(线段相交判断)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4797   Accepted: 1998 Des ...

  5. poj 3304(直线与线段相交)

    传送门:Segments 题意:线段在一个直线上的摄影相交 求求是否存在一条直线,使所有线段到这条直线的投影至少有一个交点 分析:可以在共同投影处作原直线的垂线,则该垂线与所有线段都相交<==& ...

  6. POJ 1066--Treasure Hunt(判断线段相交)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7857   Accepted: 3247 Des ...

  7. POJ 1039 直线和线段相交

    题意: 题意很好理解,从左边射过来的光线,最远能经过管道到右边多少距离. 分析: 光线一定经过一个上端点和一个下端点,这一点很容易想到.然后枚举上下端点即可 #include <iostream ...

  8. POJ 2653 Pick-up sticks(线段相交)

    题意:给定n个木棍依次放下,要求最终判断没被覆盖的木棍是哪些. 思路:快速排斥以及跨立实验可以判断线段相交. #include<algorithm> #include<cstdio& ...

  9. [poj 1127]Jack Straws[线段相交][并查集]

    题意: 给出一系列线段,判断某两个线段是否连通. 思路: 根据线段相交情况建立并查集, 在同一并查集中则连通. (第一反应是强连通分量...实际上只要判断共存即可, 具体的方向啊是没有关系的..) 并 ...

随机推荐

  1. JavaScript对象深复制

    1.原理 使用JSON,当然需要JSON安全的格式,JSON安全请参考:http://www.cnblogs.com/mengfangui/p/8257269.html 2.示例 <!DOCTY ...

  2. 【Excle】两个表格多列数据对比,找出差异

    现在有表格如下,差异A中的红色标记为区域1在区域2中找不到对应的值,差异B中的红色标记为区域2在区域1中找不到对应的值 那么怎么去查找呢? 这里用到COUNTIF跟数组公式 C3=SUM(COUNTI ...

  3. STM32f103按键检测程序实现长按短按

    背景 只要使用单片机,按键检测基本上是一定要实现的功能.按键检测要好用,最重要的是实时和去抖.初学者往往会在主循环调用按键检测程序(实时)并利用延时去抖(准确).这种在主循环内延时的做法对整个程序非常 ...

  4. 获取取并下载tuku的漫画的爬虫

    代码地址如下:http://www.demodashi.com/demo/12842.html 概述 一个简单的爬虫,实现是爬取tuku网站的漫画.并下载到脚本的文件夹中,下载的漫画按照章节名放在各自 ...

  5. Docker 使用docker-compose部署项目

    原文地址:https://github.com/eacdy/spring-cloud-book/blob/master/3%20%E4%BD%BF%E7%94%A8Docker%E6%9E%84%E5 ...

  6. [HNOI2008]玩具装箱toy(dp+斜率优化)

    斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i  ,  f[i]=sum[i]+i ,  c=L+1; 首先我们能 ...

  7. python模块学习之logging

    filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中. filemode:文件打开方式,在指定了filename时使用这个 ...

  8. stylelint — css书写规范

    sass lint guidance 一.安装:npm intsall -g stylelint 二.配置:http://stylelint.io/user-guide/rules/ (以下规则文件配 ...

  9. 一键保存网页为PDF_V1.2

    福利来了,“一键保存网页为PDF”发布以来最给力的功能来了: 1.支持大部分浏览器了(添加书签方式),测试IE8\IE9.谷歌.火狐可用: 2.转换组件“ephtmltopdf”无水印了,不用注册账号 ...

  10. ajax查找错误信息

    error: function(XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.status); alert(XMLHt ...