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位。

样例

输入

5
0 0
1 0
1 1
0 1
0.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<iostream>
#include<cstdio>
#include<cmath>
#define MAXX 2000+5
using 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<sqrt((x[i]-x[p])*(x[i]-x[p])+(y[i]-y[p])*(y[i]-y[p]))){
maxn=sqrt((x[i]-x[p])*(x[i]-x[p])+(y[i]-y[p])*(y[i]-y[p]));
maxnum=i;
}
}
}
inline void fangcheng(int i){
k=(y[i]-y[maxnum])/(x[i]-x[maxnum]);
b=y[i]-k*x[i];
}
inline void runup(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));
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;
}

【dog与lxy】8.25题解-land的更多相关文章

  1. 【dog与lxy】8.25题解-necklace

    necklace 题目描述 可怜的dog最终还是难逃厄运,被迫于lxy签下城下之约.这时候lxy开始刁难dog. Lxy首先向dog炫耀起了自己的财富,他拿出了一段很长的项链.这个项链由n个珠子按顺序 ...

  2. [NOIP模拟25]题解

    A.字符串 Catalan数不能再裸了 #include<cstdio> #include<iostream> #include<cstring> using na ...

  3. HZOI20190818模拟25题解

    题面:https://www.cnblogs.com/Juve/articles/11372379.html A:字符串 其实是CATALAN数水题... 和网格一毛一样:https://www.cn ...

  4. 【题解】滑雪 luogu1434 记忆化搜索

    记忆化搜索入门题 题目 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在 ...

  5. 【bzoj1426】收集邮票

    题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮票,所 ...

  6. 【BZOJ1426】收集邮票 期望

    [BZOJ1426]收集邮票 Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的, ...

  7. LeetCode Word Break II

    原题链接在这里:https://leetcode.com/problems/word-break-ii/ 题目: Given a string s and a dictionary of words  ...

  8. Jpeg(模拟)

    Jpeg Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  9. [TYVJ] P1004 滑雪

    滑雪   背景 Background 成成第一次模拟赛 第三道   描述 Description     trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示 ...

随机推荐

  1. css 实现三角形

    #demo1 { width: 0; height: 0; border-top: 100px solid rgba(255, 0, 0, 1); border-bottom: 50px solid ...

  2. promise用法解析

    Promise的理解 Promise是对异步操作的一种解决方案,一般情况下,如果有异步操作,就需要使用Promise对这个异步操作进行封装 使用Promise后可以使代码看起来更加优雅并且易于维护 使 ...

  3. 使用小记:Zookeeper中动态改变节点的功能

    Zookeeper 3.5+提供了reconfig功能实现动态配置节点,官方的说明是,"你再也不需要进行全部节点重启"就可以应用所有的修改: http://zookeeper.ap ...

  4. vscode 取消 eslint everywhere

    vscode装了eslint插件,一不小心点了eslint everywhere 然后任务栏就变成这样了 eslint前面是双钩 不管你打开什么项目,什么工作空间,永远都是默认开启ESlint!!! ...

  5. ES6新增数组的一些思考和使用

    ES6数组的新增 伪数组转换为数组的两种方法 Array.from()把一个伪数组转换为一个真正的数组 伪数组:有下标和length,但是不能使用数组方法 let lis = document.que ...

  6. Iperf3网络性能测试工具详解教程

    Iperf3网络性能测试工具详解教程 小M 2020年4月17日 运维 本文下载链接 [学习笔记]Iperf3网络性能测试工具.pdf 网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保 ...

  7. Docker——Registry 通过Shell管理私有仓库镜像

    使用方法: 复制代码保存为 image_registry.sh sh image_registry.sh  -h   #查看帮助 HUB=10.0.29.104:5000 改为自己的地址 #!/bin ...

  8. linux Generating /run/initramfs/rdsosreport.txt 问题

    Generating /run/initramfs/rdsosreport.txt 问题 实验室异常断电,导致Centos7重启以后出现 Generating "/run/initramfs ...

  9. mysql数据库-备份方式简介与规范

    目录 1 应对场景: 2. 备份方式分类 2.1 按备份数据类型划分 2.2 按侵入程度划分 2.3 按备份方式划分 3 备份注意要点 4 还原要点 4.1 定期还原测试,验证备份可用性 4.2 还原 ...

  10. C#中的数据结构

    Array 连续性的内存空间 快速定位查找元素,随机访问性强,查找效率高 已知的统一的元素类型,减小运行时开销 固定长度,不能再新增元素 ArrayList 连续性的内存空间 快速定位查找元素,随机访 ...