Triangle
Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 3978 | Accepted: 1085 |
Description
Given n distinct points on a plane, your task is to find the triangle that have the maximum area, whose vertices are from the given points.
Input
The input consists of several test cases. The first line of each test case contains an integer n, indicating the number of points on the plane. Each of the following n lines contains two integer xi and yi, indicating the ith points. The last line of the input is an integer −1, indicating the end of input, which should not be processed. You may assume that 1 <= n <= 50000 and −10
4 <= xi, yi <= 10
4 for all i = 1 . . . n.
Output
For each test case, print a line containing the maximum area, which contains two digits after the decimal point. You may assume that there is always an answer which is greater than zero.
Sample Input
3 3 4 2 6 2 7 5 2 6 3 9 2 0 8 0 6 5 -1
Sample Output
0.50 27.00
Source
题目大意:给出N个点,问以这些点为顶点的三角形哪个的面积最大。
分析:易证明三角形的点都在凸包上。先用garham求凸包,然后枚举两个点,再二分可以过。
更好的方法是:旋转卡壳法.
枚举三角形的第一个顶点i,
然后初始第二个顶点j=i+1,第三个顶点k=j+1,
循环k+1直到Area(i,j,k)>Area(i,j,k+1)
更新面积的最大值,下面就开始旋转卡壳了(旋转j,k两个点)
(1)如果Area(i,j,k)<Area(i,j,k+1)且k!=i,则k=k+1,否则转(2)
(2)更新面积,j=j+1,如果j=i,跳出循环
这样旋转一圈后,求得的面积就是以i为顶点的最大三角形的面积了。
时间复杂度是O(n^2)
实现见code。
备注:调了近一个小时啊= =悲剧...第一次居然是swap忘了加var...第二次是初始化位置不对...最近很浮躁啊.
codes: