题目:



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. IEEE会议投稿资料汇总http://cadcg2015.nwpu.edu.cn/index.htm

    近期投了篇IEEE的顶级会议文章,一下是比較实用的一些资料,以供參考. 1.会议主页:http://cadcg2015.nwpu.edu.cn/index.htm     (The 14th Inte ...

  2. android logo设计

    应用程序图标 (Icon)应当是一个 Alpha 通道透明的32位 PNG 图片.由于安卓设备众多,一个应用程序图标需要设计几种不同大小,如: LDPI (Low Density Screen,120 ...

  3. PL/SQL 异常错误处理

     异常错误处理 一个优秀的程序都应该可以正确处理各种出错情况,并尽可能从错误中恢复.ORACLE 提供异常情况(EXCEPTION)和异常处理(EXCEPTION HANDLER)来实现错误处理 ...

  4. Ruby 第一行代码

    main.rb #=猜数字 #这是一个简单的猜数字游戏 #==玩法 #随机生成一个『1,100』的自然数.会提示大小 class GuessNum def playGame wrongInt = tr ...

  5. asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(三)—— 简单登录页面+sqlite+动软代码生成器的使用

    上一节讲到利用easyui的layout.tree.tab和datagrid创建用户管理的页面,注意利用到easyui的页面一定要按顺序添加jQuery和easyUI的.js和.css样式,灵活查看e ...

  6. IIS各种问题汇总

    1.不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的(overrideModeDefault="Deny"),或者是通过包含 overrid ...

  7. js使用ctrl+s保存表单提升用户体验

    本质上是监控ctrl+s 然后触发相应事件 <script language="JavaScript"> //Ctrl+s保存 document.onkeydown=f ...

  8. EF实体查询出的数据List<T>转DataTable出现【DataSet 不支持 System.Nullable<>】的问题

    public static DataTable ToDataTable<T>(this IEnumerable<T> varlist, CreateRowDelegate< ...

  9. VS2017调试MVC程序,中文输入法下浏览器闪退,程序调试终止

    工具->选项-> 项目和解决方案->Web项目->浏览器窗口关闭时停止调试器(s) 复选√ 去掉即可,

  10. OA项目之权限设计②

    1.接着昨天的今天到了设计怎样成功的实现权限分配的功能,首先我们看下这些功能的过程例如以下图: 首先是从user的list页面看到设置权限的button,点击进去进入设置权限的页面 进入设置权限页面, ...