题意:

给出一系列的点,要求寻找最多4个点。使得组成一个面积最大的多边形



思路:

非常显然仅仅有两种情况。要么是三角形,要么是四边形

首先不难想到的是。先要把最外面的点都找出来,事实上就是找凸包

可是并没有做过凸包,那么怎么办?

我们知道。ab与ac向量相乘得到ab*ac>=0的情况下。能够知道全部符合这个条件的。都固定在顺时针,那么我们能够通过这个,来求得全部外层的点

得到这些点之后。我们就能够来找出答案了



  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stack>
  5. #include <queue>
  6. #include <map>
  7. #include <set>
  8. #include <vector>
  9. #include <math.h>
  10. #include <bitset>
  11. #include <algorithm>
  12. #include <climits>
  13. using namespace std;
  14.  
  15. #define ls 2*i
  16. #define rs 2*i+1
  17. #define UP(i,x,y) for(i=x;i<=y;i++)
  18. #define DOWN(i,x,y) for(i=x;i>=y;i--)
  19. #define MEM(a,x) memset(a,x,sizeof(a))
  20. #define W(a) while(a)
  21. #define gcd(a,b) __gcd(a,b)
  22. #define LL long long
  23. #define ULL unsigned long long
  24. #define N 1005
  25. #define INF 0x3f3f3f3f
  26. #define EXP 1e-8
  27. #define rank rank1
  28. const int mod = 1000000007;
  29.  
  30. struct point
  31. {
  32. int x,y;
  33. } a[N],s[N];
  34. int t,n;
  35.  
  36. int ads(int a)
  37. {
  38. return a<0?-a:a;
  39. }
  40.  
  41. int mult(point a,point b,point c)
  42. {
  43. return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
  44. }
  45.  
  46. int cmp(point a,point b)
  47. {
  48. if(a.y==b.y)
  49. return a.x<b.x;
  50. return a.y<b.y;
  51. }
  52.  
  53. int set1(point a[],int n,point s[])
  54. {
  55. int i,j,k;
  56. int top = 1;
  57. sort(a,a+n,cmp);
  58. if(n==0) return 0;
  59. s[0] = a[0];
  60. if(n==1) return 1;
  61. s[1] = a[1];
  62. if(n==2) return 2;
  63. s[2] = a[2];
  64. for(i = 2; i<n; i++)//先找右边的外层
  65. {
  66. while(top&&mult(a[i],s[top],s[top-1])>=0)//新进来的在顺时针方向,能够代替已保存在栈内的
  67. top--;
  68. s[++top] = a[i];
  69. }
  70. int len = top;
  71. s[++top] = a[n-2];
  72. for(i = n-3; i>=0; i--)//找左边的外层
  73. {
  74. while(top!=len&&mult(a[i],s[top],s[top-1])>=0)
  75. top--;
  76. s[++top] = a[i];
  77. }
  78. return top;
  79. }
  80.  
  81. void solve()
  82. {
  83. int i,j,k,cnt,area;
  84. for(int i=0; i<n; i++)
  85. scanf("%d%d",&a[i].x,&a[i].y);
  86. cnt = set1(a,n,s);
  87. if(cnt<3)
  88. {
  89. printf("0\n");
  90. }
  91. else if(cnt==3)
  92. {
  93. area = mult(s[2],s[1],s[0]);
  94. area = ads(area);
  95. if(area%2) printf("%d.5\n",area/2);
  96. else printf("%d\n",area/2);
  97. }
  98. else
  99. {
  100. area=-INF;
  101. s[cnt] = s[0];
  102. for(i = 0; i<cnt; i++)
  103. {
  104. int l = i,r = i+2;
  105. for(j = i+2; j<cnt; j++)//以i,j为四边形对角线。两边循环保证两个三角形不相交算出最大面积
  106. {
  107. while(abs(mult(s[l+1],s[j],s[i]))>abs(mult(s[l],s[j],s[i]))) l = (l+1)%cnt;
  108. int s1 = abs(mult(s[l],s[j],s[i]));
  109. while(abs(mult(s[r+1],s[j],s[i]))>abs(mult(s[r],s[j],s[i]))) r = (r+1)%cnt;
  110. int s2 = abs(mult(s[r],s[j],s[i]));
  111. area = max(area,s1+s2);
  112. }
  113. }
  114. if(area%2) printf("%d.5\n",area/2);
  115. else printf("%d\n",area/2);
  116. }
  117. }
  118.  
  119. int main()
  120. {
  121. scanf("%d",&t);
  122. while(t--)
  123. {
  124. scanf("%d",&n);
  125. solve();
  126. }
  127.  
  128. return 0;
  129. }

BAPC2014 C&amp;&amp;HUNNU11583:Citadel Construction(几何)的更多相关文章

  1. Construction of Primitives in Open Cascade

    Construction of Primitives in Open Cascade eryar@163.com 一.创建基本图元 Making Primitives 将用到如下的类创建基本图元,包括 ...

  2. ArcEngine开发各种几何错误代码

    E_GEOMETRY_AMBIGUOUSPARTTYPE - Static variable in interface com.esri.arcgis.geometry.esriGeometryErr ...

  3. HDU 5128.The E-pang Palace-计算几何

    The E-pang Palace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Othe ...

  4. 关于Three.js基本几何形状之SphereGeometry球体学习

    一.有关球体SphereGeometry构造函数参数说明 <1>.SphereGeometry(radius, widthSegments, heightSegments, phiStar ...

  5. 几何服务,cut功能测试

    关于几何服务 几何服务用于辅助应用程序执行各种几何计算,如缓冲区.简化.面积和长度计算以及投影.在 ArcGIS Server 管理器中启动几何服务之后,您才能够在应用程序开发过程中使用该服务. 问题 ...

  6. 几何服务,cut功能,输入要素target(修改后)内容。

    几何服务,cut功能测试,输入要素target(修改后)内容. {"displayFieldName":"","fieldAliases": ...

  7. 几何服务,cut功能,输入要素target(修改前)内容。

    几何服务,cut功能测试,输入要素target(修改前)内容. {"geometryType":"esriGeometryPolyline","geo ...

  8. 如何让你的UWP应用程序无缝调用几何作图

    有时候需要编辑一些几何图形,如三角形,圆锥曲线等,在UWP应用中加入这些几何作图功能是件费时间又很难做好的事.其实Windows 10 应用商店中已有一些专业的几何作图工具了,那么能借来一用吗?答案是 ...

  9. poj 2031Building a Space Station(几何判断+Kruskal最小生成树)

    /* 最小生成树 + 几何判断 Kruskal 球心之间的距离 - 两个球的半径 < 0 则说明是覆盖的!此时的距离按照0计算 */ #include<iostream> #incl ...

随机推荐

  1. POJ 2079 Triangle 旋转卡壳求最大三角形

    求点集中面积最大的三角形...显然这个三角形在凸包上... 但是旋转卡壳一般都是一个点卡另一个点...这种要求三角形的情况就要枚举底边的两个点 卡另一个点了... 随着底边点的递增, 最大点显然是在以 ...

  2. 2017国家集训队作业[agc014d]Black and White Tree

    2017国家集训队作业[agc014d]Black and White Tree 题意: ​ 有一颗n个点的树,刚开始每个点都没有颜色.Alice和Bob会轮流对这棵树的一个点涂色,Alice涂白,B ...

  3. mysql存储emoji表情报错处理,qq互联mysql存储昵称中带表情的数据时报错。

    前言 做qq互联登录时发现一个问题,如果qq昵称中有表情时存入mysql数据库会报错. java.sql.SQLException: Incorrect string value: "ð&q ...

  4. 【2017 Multi-University Training Contest - Team 2】TrickGCD

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6053 [Description] 给你一个b数组,让你求一个a数组: 要求,该数组的每一位都小于等 ...

  5. [置顶] Docker学习总结(1)——Docker实战之入门以及Dockerfile(一)

    一.Docker是什么? 首先Docker是软件工业上的集装箱技术 回顾,在没有集装箱出现以前,传统运输行业中,会存在这些问题: 在运输过程中,货物损坏 装卸.运输货物,效率低下 运输手续繁多及运输环 ...

  6. NYOJ 927 The partial sum problem 【DFS】+【剪枝】

    The partial sum problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 One day,Tom's girlfriend give him a ...

  7. zenDiscovery和master选举

    上一篇通过 ElectMasterService源码,分析了master选举的原理的大部分内容:master候选节点ID排序保证选举一致性及通过设置最小可见候选节点数目避免brain split.节点 ...

  8. java创建节点和单向链表

    package datastructure; public class Node { private Object data; private Node next; public Node() { t ...

  9. magento getCarriers 分析

    完整的设置订单追踪信息的时候我们可能会用到它.在后台中他在这里设置: 有的时候我们想要设置自己定义的 carrier 比如 顺丰 申通 圆通 ..等等 我们能够先从 magento api 入手分析 ...

  10. CentOS6 安装中文包和变更系统默认语言

    CentOS6 安装中文包和变更系统默认语言   用 yum 安装语言包的命令是 yum groupinstall <language>-support    ,其中 <langua ...