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

样例

输入

  1. 5
  2. 0 0
  3. 1 0
  4. 1 1
  5. 0 1
  6. 0.5 0.5

输出

  1. 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. 对于第二个点,第三个······重复操作

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #define MAXX 2000+5
  5. using namespace std;
  6. int n,maxnum,maxup,maxunder;
  7. double x[MAXX],y[MAXX],k,b;
  8. inline void search(int p){
  9. double maxn=-1000;
  10. for(int i=1;i<=n;i++){
  11. if(i==p) continue;
  12. if(maxn<sqrt((x[i]-x[p])*(x[i]-x[p])+(y[i]-y[p])*(y[i]-y[p]))){
  13. maxn=sqrt((x[i]-x[p])*(x[i]-x[p])+(y[i]-y[p])*(y[i]-y[p]));
  14. maxnum=i;
  15. }
  16. }
  17. }
  18. inline void fangcheng(int i){
  19. k=(y[i]-y[maxnum])/(x[i]-x[maxnum]);
  20. b=y[i]-k*x[i];
  21. }
  22. inline void runup(int p){
  23. double maxn=-1000;
  24. for(int i=1;i<=n;i++){
  25. if(i==p) continue;
  26. if(x[i]*k+b>=y[i]) continue;
  27. if(maxn<(abs(k*x[i]-y[i]+b)/sqrt(k*k+1))){
  28. maxn=(abs(k*x[i]-y[i]+b)/sqrt(k*k+1));
  29. maxup=i;
  30. }
  31. }
  32. }
  33. inline void rununder(int p){
  34. double maxn=-1000;
  35. for(int i=1;i<=n;i++){
  36. if(i==p) continue;
  37. if(x[i]*k+b<=y[i]) continue;
  38. if(maxn<(abs(k*x[i]-y[i]+b)/sqrt(k*k+1))){
  39. maxn=(abs(k*x[i]-y[i]+b)/sqrt(k*k+1));
  40. maxunder=i;
  41. }
  42. }
  43. }
  44. inline double get_s(int i){
  45. double s=0;
  46. s+=x[i]*y[maxup]-x[maxup]*y[i];
  47. s+=x[maxup]*y[maxnum]-x[maxnum]*y[maxup];
  48. s+=x[maxnum]*y[maxunder]-x[maxunder]*y[maxnum];
  49. s+=x[maxunder]*y[i]-x[i]*y[maxunder];
  50. s*=0.5;
  51. s=abs(s);
  52. return s;
  53. }
  54. int main(){
  55. freopen("Land.in","r",stdin);
  56. freopen("Land.out","w",stdout);
  57. scanf("%d",&n);
  58. for(int i=1;i<=n;i++)
  59. scanf("%lf%lf",&x[i],&y[i]);
  60. double ans=-1;
  61. for(int i=1;i<=n;i++){
  62. search(i);
  63. fangcheng(i);
  64. runup(i);
  65. rununder(i);
  66. ans=max(get_s(i),ans);
  67. }
  68. printf("%.3lf",ans);
  69. return 0;
  70. }

【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. windows调起git bash执行sh脚本定时统计git仓库代码量

    本来挺简单的一个东西硬是弄了两天 心力交瘁 找了网上不少资料 整理一下发给大家 首先是统计每个人的代码量的git命令 在网上找的 我这里做了以下修改 git log --format='%aN'|so ...

  2. Java语言的三大特性

    Java语言的三大特性 1.封装 1.1  概念: 封装也成为信息异常,隐藏对象的属性和实现细节,仅对外公开接口(外部不可以直接看到对象的属性细节并且不能直接更改属性的值,只能通过方法来读取或更改属性 ...

  3. mysql基础之mariadb galera集群(多主)

    一.概念 galera集群多用于关键性业务,因为galera集群为了数据的一致性,采用的是同步的机制,这就使galera牺牲了一部分性能来换取数据一致性. galera集群是基于wsrep协议(端口4 ...

  4. JDK 14 都已经发布了,Java 8 依然是我的最爱

    在 JDK 版本的世界里,从来都是 Oracle 发他的新版本,我们 Java 程序员继续用我们的老版本 几年之前用 JDK 7,后来终于升级到了 JDK 8.自从升级了没多久,JDK 就开始了半年发 ...

  5. 3 当某个应用的CPU使用达到100%,该怎么办?

    你最常用什么指标来描述系统的 CPU 性能呢?我想你的答案,可能不是平均负载,也不是 CPU 上下文切换,而是另一个更直观的指标-- CPU 使用率.CPU 使用率是单位时间内 CPU 使用情况的统计 ...

  6. CentOS7 删除virbr0虚拟网卡

    在CentOS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡,这个是因为在虚拟化中有使用到libvirtd服务生成的,如果不需要可 ...

  7. Spring 是什么?

    概述 Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好.易于测试.可重用的代码. Spring 框架是一个开源的 Ja ...

  8. Autofac 集成测试 在 ConfigureContainer 之后进行 Mock 注入

    在使用 Autofac 框架进行开发后,编写集成测试时,需要用 Mock 的用于测试的模拟的类型去代替容器里面已注入的实际类型,也就需要在 Autofac 完全收集完成之后,再次注入模拟的对象进行覆盖 ...

  9. 在pycharm进行单元测试(unittest python)

    在Edit Configuration中添加Python test 选中相应的脚本或者文件夹 # coding:utf-8 import unittest import requests from c ...

  10. js 字典与Map对象

    本文链接:https://blog.csdn.net/qq_35014708/article/details/89458175