【dog与lxy】8.25题解-land
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的。
优美的暴力
- 对于第一个点,找出离它最远的点,连接这两个点成一个线段
- 枚举每一个点,分别找出线段两边距离线段最远的点
- 用叉乘或者分割成两个三角形计算四边形的面积
- 与最大值比较,更新最大值
- 对于第二个点,第三个······重复操作
代码
#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的更多相关文章
- 【dog与lxy】8.25题解-necklace
necklace 题目描述 可怜的dog最终还是难逃厄运,被迫于lxy签下城下之约.这时候lxy开始刁难dog. Lxy首先向dog炫耀起了自己的财富,他拿出了一段很长的项链.这个项链由n个珠子按顺序 ...
- [NOIP模拟25]题解
A.字符串 Catalan数不能再裸了 #include<cstdio> #include<iostream> #include<cstring> using na ...
- HZOI20190818模拟25题解
题面:https://www.cnblogs.com/Juve/articles/11372379.html A:字符串 其实是CATALAN数水题... 和网格一毛一样:https://www.cn ...
- 【题解】滑雪 luogu1434 记忆化搜索
记忆化搜索入门题 题目 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在 ...
- 【bzoj1426】收集邮票
题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮票,所 ...
- 【BZOJ1426】收集邮票 期望
[BZOJ1426]收集邮票 Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的, ...
- LeetCode Word Break II
原题链接在这里:https://leetcode.com/problems/word-break-ii/ 题目: Given a string s and a dictionary of words ...
- Jpeg(模拟)
Jpeg Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- [TYVJ] P1004 滑雪
滑雪 背景 Background 成成第一次模拟赛 第三道 描述 Description trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示 ...
随机推荐
- windows调起git bash执行sh脚本定时统计git仓库代码量
本来挺简单的一个东西硬是弄了两天 心力交瘁 找了网上不少资料 整理一下发给大家 首先是统计每个人的代码量的git命令 在网上找的 我这里做了以下修改 git log --format='%aN'|so ...
- Java语言的三大特性
Java语言的三大特性 1.封装 1.1 概念: 封装也成为信息异常,隐藏对象的属性和实现细节,仅对外公开接口(外部不可以直接看到对象的属性细节并且不能直接更改属性的值,只能通过方法来读取或更改属性 ...
- mysql基础之mariadb galera集群(多主)
一.概念 galera集群多用于关键性业务,因为galera集群为了数据的一致性,采用的是同步的机制,这就使galera牺牲了一部分性能来换取数据一致性. galera集群是基于wsrep协议(端口4 ...
- JDK 14 都已经发布了,Java 8 依然是我的最爱
在 JDK 版本的世界里,从来都是 Oracle 发他的新版本,我们 Java 程序员继续用我们的老版本 几年之前用 JDK 7,后来终于升级到了 JDK 8.自从升级了没多久,JDK 就开始了半年发 ...
- 3 当某个应用的CPU使用达到100%,该怎么办?
你最常用什么指标来描述系统的 CPU 性能呢?我想你的答案,可能不是平均负载,也不是 CPU 上下文切换,而是另一个更直观的指标-- CPU 使用率.CPU 使用率是单位时间内 CPU 使用情况的统计 ...
- CentOS7 删除virbr0虚拟网卡
在CentOS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡,这个是因为在虚拟化中有使用到libvirtd服务生成的,如果不需要可 ...
- Spring 是什么?
概述 Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好.易于测试.可重用的代码. Spring 框架是一个开源的 Ja ...
- Autofac 集成测试 在 ConfigureContainer 之后进行 Mock 注入
在使用 Autofac 框架进行开发后,编写集成测试时,需要用 Mock 的用于测试的模拟的类型去代替容器里面已注入的实际类型,也就需要在 Autofac 完全收集完成之后,再次注入模拟的对象进行覆盖 ...
- 在pycharm进行单元测试(unittest python)
在Edit Configuration中添加Python test 选中相应的脚本或者文件夹 # coding:utf-8 import unittest import requests from c ...
- js 字典与Map对象
本文链接:https://blog.csdn.net/qq_35014708/article/details/89458175