http://poj.org/problem?id=2079

题目大意:求最大面积的三角形。

——————————————————

可以知道,最大面积的三角形的顶点一定是最大凸包的顶点。

接下来就是O(n*n)的常数优化题了(利用单峰性)。

(但其实不是n*n的,因为我们求的是纯凸包,所以n会小一些)

  1. #include<cstdio>
  2. #include<queue>
  3. #include<cctype>
  4. #include<cstring>
  5. #include<stack>
  6. #include<cmath>
  7. #include<algorithm>
  8. using namespace std;
  9. typedef double dl;
  10. const dl eps=1e-;
  11. const int N=;
  12. struct point{
  13. dl x;
  14. dl y;
  15. }p[N],q[N];
  16. int n,per[N],l;
  17. inline point getmag(point a,point b){
  18. point s;
  19. s.x=b.x-a.x;s.y=b.y-a.y;
  20. return s;
  21. }
  22. inline dl multiX(point a,point b){
  23. return a.x*b.y-b.x*a.y;
  24. }
  25. inline dl dis(point a,point b){
  26. return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
  27. }
  28. inline bool cmp(int u,int v){
  29. dl det=multiX(getmag(p[],p[u]),getmag(p[],p[v]));
  30. if(fabs(det)>eps)return det>eps;
  31. return dis(p[],p[u])-dis(p[],p[v])<-eps;
  32. }
  33. void graham(){
  34. int id=;
  35. for(int i=;i<=n;i++){
  36. if(p[i].x-p[id].x<-eps||(fabs(p[i].x-p[id].x)<eps&&p[i].y-p[id].y<-eps))id=i;
  37. }
  38. if(id!=)swap(p[],p[id]);
  39. for(int i=;i<=n;i++)per[i]=i;
  40. sort(per+,per+n+,cmp);
  41. l=;
  42. q[++l]=p[];
  43. for(int i=;i<=n;i++){
  44. int j=per[i];
  45. while(l>=&&multiX(getmag(q[l-],p[j]),getmag(q[l-],q[l]))>-eps){
  46. l--;
  47. }
  48. q[++l]=p[j];
  49. }
  50. return;
  51. }
  52. inline dl area(){
  53. if(l<=)return ;
  54. dl ans=;
  55. for(int i=;i<=l;i++){
  56. int j=i%l+;
  57. int k=j%l+;
  58. while(){
  59. dl s1=multiX(getmag(q[i],q[j]),getmag(q[i],q[k]));
  60. dl s2=multiX(getmag(q[i],q[j]),getmag(q[i],q[k%l+]));
  61. if(fabs(s1)-fabs(s2)>-eps){
  62. break;
  63. }
  64. k=k%l+;
  65. }
  66. while(i!=j&&j!=k&&i!=k){
  67. dl s=multiX(getmag(q[i],q[j]),getmag(q[i],q[k]));
  68. ans=max(ans,fabs(s)/2.0);
  69. while(){
  70. dl s1=multiX(getmag(q[i],q[j]),getmag(q[i],q[k]));
  71. dl s2=multiX(getmag(q[i],q[j]),getmag(q[i],q[k%l+]));
  72. if(fabs(s1)-fabs(s2)>-eps){
  73. break;
  74. }
  75. k=k%l+;
  76. }
  77. j=j%l+;
  78. }
  79. }
  80. return ans;
  81. }
  82. int main(){
  83. while(scanf("%d",&n)!=EOF&&n!=-){
  84. for(int i=;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
  85. graham();
  86. printf("%.2f\n",area());
  87. }
  88. return ;
  89. }

POJ2079:Triangle——题解的更多相关文章

  1. ZOJ 4081 Little Sub and Pascal's Triangle 题解

    ZOJ 4081 Little Sub and Pascal's Triangle 题解 题意 求杨辉三角第n行(从1开始计数)有几个奇数. 考察的其实是杨辉--帕斯卡三角的性质,或者说Gould's ...

  2. codechef Sums in a Triangle题解

    Let's consider a triangle of numbers in which a number appears in the first line, two numbers appear ...

  3. POJ2079 Triangle

    题面 题解 我什么时候会过这种东西???(逃 旋转卡壳板子题(听说这个算法有十六种读音??? 我是真的忘了这道题目怎么做了,挂个\(blog\),等我学会了再写题解 我的代码里居然有注释???好像还是 ...

  4. CF336A Vasily the Bear and Triangle 题解

    Content 一个矩形的顶点为 \((0,0)\),其对顶点为 \((x,y)\),现过 \((x,y)\) 作直线,分别交 \(x\) 轴和 \(y\) 轴于 \(A,B\) 两点,使得 \(\t ...

  5. Codechef Not a Triangle题解

    找出一个数组中的三个数,三个数不能组成三角形. 三个数不能组成三角形的条件是:a + b < c 两边和小于第三边. 这个问题属于三个数的组合问题了.暴力法可解,可是时间效率就是O(n*n*n) ...

  6. CF1064A Make a triangle! 题解

    Content 有三条长度分别为 \(a,b,c\) 的线段.你可以在一个单位时间内将一条线段的长度增加 \(1\),试求出能使这三条线段组成一个三角形的最短时间. 数据范围:\(1\leqslant ...

  7. POJ 1927 Area in Triangle 题解

    link Description 给出三角形三边长,给出绳长,问绳在三角形内能围成的最大面积.保证绳长 \(\le\) 三角形周长. Solution 首先我们得知道,三角形的内切圆半径就是三角形面积 ...

  8. 120. Triangle

    题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...

  9. Triangle leetcode java

    题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...

随机推荐

  1. C# 调用webserver 出现:未能从程序集“jgd3jufm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型

    一般都是 用的动态调用webserver,然后这次用的是固定的 首先 最后 实例化改接口,然后直接传值调用

  2. NPOI List数据源 导出excel

    List数据源生成HSSFWorkbook通用方法: public class WorkBook { public static HSSFWorkbook BuildSwitchData<T&g ...

  3. 180611-Spring之RedisTemplate配置与使用

        logo 文章链接:https://liuyueyi.github.io/hexblog/2018/06/11/180611-Spring之RedisTemplate配置与使用/ Spring ...

  4. Objective-C Block数据类型 @protocol关键字

    Block数据类型 Block封装了一段代码 可以在任何时候执行 Block可以作为函数参数或者函数的返回值 而其本身又可以带输入参数或返回值 苹果官方建议尽量多用Block 在多线程 异步任务 集合 ...

  5. Java开发工程师(Web方向) - 01.Java Web开发入门 - 第3章.Tomcat

    第3章--Tomcat Tomcat安装与运行 Tomcat:目前最常用的基于java的web应用服务器 本课程中所有的Java代码最终都需要部署到Tomcat中运行 Tomcat的配置文件是XML的 ...

  6. Python常用函数--return 语句

    在Python教程中return 语句是函数中常用的一个语句.return 语句用于从函数中返回,也就是中断函数.我们也可以选择在中断函数时从函数中返回一个值.案例(保存为 function_retu ...

  7. 牛客网暑期ACM多校训练营(第五场):F - take

    链接:牛客网暑期ACM多校训练营(第五场):F - take 题意: Kanade有n个盒子,第i个盒子有p [i]概率有一个d [i]大小的钻石. 起初,Kanade有一颗0号钻石.她将从第1到第n ...

  8. Bootstrap框架(图标)

    Glyphicons 字体图标 所有可用的图标 包括250多个来自 Glyphicon Halflings 的字体图标.Glyphicons Halflings 一般是收费的,但是他们的作者允许 Bo ...

  9. LeetCode - 268. Missing Number - stable_sort应用实例 - ( C++ ) - 解题报告

    1.题目大意 Given an array nums, write a function to move all 0's to the end of it while maintaining the ...

  10. Solium代码测试框架

    Solium, 在solid中,Linter用于标识和修复样式&安全问题 //调用测试 solium -d contracts --fix 源代码名称:Solium 源代码网址:http:// ...