博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【dog与lxy】8.25题解-land
阅读量:4311 次
发布时间:2019-06-06

本文共 2116 字,大约阅读时间需要 7 分钟。

land


题目描述

dog终于有了一块领地,但是现在可怜的dog面临着lxy的入侵,于是他决定在自己的领地设置炮楼来保卫自己免受QJ。现在dog找到它可以在领地上设置炮楼的N个地点。但是留给dog的时间不多了,dog决定赶快建4个炮楼。而现在的问题是dog希望这4个炮楼的防守区域最大。而4个炮楼的防守区域就是这4个炮楼的多边形的面积。Dog马上找到了你,请你帮助他,而你不忍心让dog惨遭蹂躏,那么请告诉dog他的防守区域最大为多少。(保证最终得到的防守区域是凸四边形)

输出输出

输入文件:

第1行1个数n,表示可能修建炮楼的位置。接下来n行,每行2个数x,y,表示可能的炮楼的位置。(不考虑地球曲面的影响,默认为dog的领地是块平面,然后建立直角坐标系,给出的就是直角坐标系上的位置)。

输出文件:

dog他的防守区域最大为多少。精确到小数点后3位。

样例

输入

50 01 01 10 10.5 0.5

输出

1

说明

数据范围

100%的数据中,n<=2000,|x|,|y|<=100000.

50%的数据中,n<=1000, |x|,|y|<=10000.
30%的数据中,n<=50, |x|,|y|<=100.

思路

给出点集S,要求从S中选出4个点,使得这四个点组成的四边形面积最大(S<=2000)

如果最终得到的是凸四边形,题目就好做得多了。
对于这一题数据较小,O(n^2)的复杂度是能够AC的。

优美的暴力

  1. 对于第一个点,找出离它最远的点,连接这两个点成一个线段
  2. 枚举每一个点,分别找出线段两边距离线段最远的点
  3. 用叉乘或者分割成两个三角形计算四边形的面积
  4. 与最大值比较,更新最大值
  5. 对于第二个点,第三个······重复操作

代码

#include
#include
#include
#define MAXX 2000+5using namespace std;int n,maxnum,maxup,maxunder;double x[MAXX],y[MAXX],k,b;inline void search(int p){ double maxn=-1000; for(int i=1;i<=n;i++){ if(i==p) continue; if(maxn
=y[i]) continue; if(maxn<(abs(k*x[i]-y[i]+b)/sqrt(k*k+1))){ maxn=(abs(k*x[i]-y[i]+b)/sqrt(k*k+1)); maxup=i; } }}inline void rununder(int p){ double maxn=-1000; for(int i=1;i<=n;i++){ if(i==p) continue; if(x[i]*k+b<=y[i]) continue; if(maxn<(abs(k*x[i]-y[i]+b)/sqrt(k*k+1))){ maxn=(abs(k*x[i]-y[i]+b)/sqrt(k*k+1)); maxunder=i; } }}inline double get_s(int i){ double s=0; s+=x[i]*y[maxup]-x[maxup]*y[i]; s+=x[maxup]*y[maxnum]-x[maxnum]*y[maxup]; s+=x[maxnum]*y[maxunder]-x[maxunder]*y[maxnum]; s+=x[maxunder]*y[i]-x[i]*y[maxunder]; s*=0.5; s=abs(s); return s;}int main(){ freopen("Land.in","r",stdin); freopen("Land.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]); double ans=-1; for(int i=1;i<=n;i++){ search(i); fangcheng(i); runup(i); rununder(i); ans=max(get_s(i),ans); } printf("%.3lf",ans); return 0;}

转载于:https://www.cnblogs.com/bbqub/p/7428468.html

你可能感兴趣的文章
0909我对编译原理的见解
查看>>
lib 和 dll
查看>>
hdu 2042 - 不容易系列之二
查看>>
Linux下设置postgresql数据库开机启动
查看>>
mysql函数技巧整理
查看>>
二叉树
查看>>
IO多路复用--epoll详解
查看>>
[线段树优化应用] 数星星Star
查看>>
表单序列化以及后台表单数据参数的提取
查看>>
SQL语句(十五)视图
查看>>
nginx 设置开机启动
查看>>
继承和组合
查看>>
小程序-----上传图片
查看>>
工作流表单自定义的误区
查看>>
带有循环功能的存储过程
查看>>
数据结构-链表插入节点
查看>>
软件项目开发流程
查看>>
常用排序算法
查看>>
DOM(文档对象模型)
查看>>
为什么要安全域,哪些区域需要单独划分安全域
查看>>