hdu 2202 最大三角形 (凸包)

最大三角形


Time Limit: 5000/2000 MS
(Java/Others)    Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 3078    Accepted
Submission(s): 1026

Problem Description

老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大。
Eddy对这道题目百思不得其解,想不通用什么方法来解决,因此他找到了聪明的你,请你帮他解决这个题目。

Input

输入数据包含多组测试用例,每个测试用例的第一行包含一个整数n,表示一共有n个互不相同的点,接下来的n行每行包含2个整数xi,yi,表示平面上第i个点的x与y坐标。你可以认为:3
<= n <= 50000 而且 -10000 <= xi, yi <= 10000.

Output

对于每一组测试数据,请输出构成的最大的三角形的面积,结果保留两位小数。
每组输出占一行。

Sample Input

3

3 4

2 6

3 7

6

2 6

3 9

2 0

8 0

6 6

7 7

Sample Output

1.50

27.00

Author

Eddy

Recommend

lcy   |   We have
carefully selected several similar problems for you:  2215 3629 3685 2204 2205

最大三角形的三个顶点一定在这些点所形成的的凸包上。

先用graham把凸包求出,再暴力凸包上的点。


 1 //78MS    716K    1509 B    C++
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<math.h>
5 #define N 50005
6 struct node{
7 double x,y;
8 }p[N],stack[N];
9 double max(double a,double b)
10 {
11 return a>b?a:b;
12 }
13 double dist(node a,node b)
14 {
15 return sqrt((a.y-b.y)*(a.y-b.y)+(a.x-b.x)*(a.x-b.x));
16 }
17 double crossprod(node a,node b,node c)
18 {
19 return ((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y))/2.0;
20 }
21 int cmp(const void*a,const void*b)
22 {
23 node c=*(node*)a;
24 node d=*(node*)b;
25 double k=crossprod(p[0],c,d);
26 if(k<0 || !k && dist(p[0],c)>dist(p[0],d))
27 return 1;
28 return -1;
29 }
30 int Graham(int n)
31 {
32 for(int i=1;i<n;i++)
33 if(p[i].x<p[0].x || p[i].x==p[0].x && p[i].y<p[0].y){
34 node temp=p[0];
35 p[0]=p[i];
36 p[i]=temp;
37 }
38 qsort(p+1,n-1,sizeof(p[0]),cmp);
39 p[n]=p[0];
40 for(int i=0;i<3;i++) stack[i]=p[i];
41 int top=2;
42 for(int i=3;i<n;i++){
43 while(crossprod(stack[top-1],stack[top],p[i])<=0 && top>=2)
44 top--;
45 stack[++top]=p[i];
46 }
47 return top+1;
48 }
49 double solve(int n) //暴力凸包上的点
50 {
51 double ans=0;
52 for(int i=0;i<n;i++)
53 for(int j=i+1;j<n;j++)
54 for(int k=j+1;k<n;k++)
55 ans=max(ans,crossprod(stack[i],stack[j],stack[k]));
56 return ans;
57 }
58 int main(void)
59 {
60 int n;
61 while(scanf("%d",&n)!=EOF)
62 {
63 for(int i=0;i<n;i++)
64 scanf("%lf%lf",&p[i].x,&p[i].y);
65 printf("%.2lf\n",solve(Graham(n)));
66 }
67 return 0;
68 }

时间: 2024-08-04 19:22:38

hdu 2202 最大三角形 (凸包)的相关文章

HDU 2202 最大三角形

最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3248    Accepted Submission(s): 1098 Problem Description 老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大.Eddy对这道

HDOJ 2202 最大三角形 凸包旋转卡壳求最大三角形面积

凸包旋转卡壳求最大三角形面积 最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3316    Accepted Submission(s): 1119 Problem Description 老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角

HDU 2091 空心三角形 --- 水题

/* HDU 2091 空心三角形 --- 水题 */ #include <cstdio> int main() { int kase = 0; char ch; int h, t; //h表示高 while (scanf("%c", &ch) == 1 && ch != '@'){ scanf("%d", &h); if (kase++){ printf("\n"); } getchar(); if

HDU 2510 符号三角形 NYOJ491 幸运三角形

符号三角形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 860    Accepted Submission(s): 437 Problem Description 符号三角形的 第1行有n个由"+"和"-"组成的符号 ,以后每行符号比上行少1个,2个同号下面是"+",2个异 号下面

hdu 3685 多边形重心+凸包

Rotational Painting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2498    Accepted Submission(s): 702 Problem Description Josh Lyman is a gifted painter. One of his great works is a glass pain

POJ 1113 || HDU 1348: wall(凸包问题)

传送门: POJ:点击打开链接 HDU:点击打开链接 下面是POJ上的题: Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29121   Accepted: 9746 Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall around the King's cast

(hdu step 7.1.6)最大三角形(凸包的应用——在n个点中找到3个点,它们所形成的三角形面积最大)

题目: 最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 121 Accepted Submission(s): 61   Problem Description 老师在计算几何这门课上给Eddy布置了一道题目.题目是这种:给定二维的平面上n个不同的点,要求在这些点里寻找三个点.使他们构成的三角形拥有的面积最大.Eddy对这道题目百

hdu 1348 Wall(凸包模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3386    Accepted Submission(s): 968 Problem Description Once upon a time there was a gre

hdu 1374 求三角形外接圆的半径

两种求三角形外接圆半径的方法: 方法一: 已知三角形的三边为a,b,c,a小于等于b小于等于c, 它的外接圆半径为 R=abc/( 4S) S为三角形面积,可由海伦公式得到:S=√[p(p-a)(p-b)(p-c)]其中P是周长的一半 证明:对于任意三角形,其面积S=(1/2)*absinC 由正弦定理:a/sinA=b/sinB=c/sinC=2R 因,c/sinC=2R 故,R=c/2sinC 又由面积公式得:sinC=2S/ab 故,R=(c/2)/(2S/ab) 即,R=abc/4S 方