Description

在平面上找 n 个点, 要求这 n 个点离原点的距离分别为 r 1 ,r 2 ,…,r n . 最大化这 n 个点构成的
凸包面积, 凸包上的点的顺序任意.不要求点全部在凸包上

Input

第一行一个整数 n.
接下来一行 n 个整数依次表示 r i

Output

输出一个实数表示答案, 要求绝对误差或相对误差 ≤ 10^−6 .

Sample Input

4
5
8
58
85

Sample Output

2970

Data Constraint

对于前 20% 的数据, n ≤ 3;
对于前 40% 的数据, n ≤ 4;
对于另 20% 的数据, r 1 = r 2 = … = r n ;
对于 100% 的数据, 1 ≤ n ≤ 8, 1 ≤ r i ≤ 1000.

Solution

  • 考虑先暴力枚举 选几个点点的相对顺序

  • 之后我们要使 Ans=R1R2sin(θ1)+R2R3sin(θ2)+⋅⋅⋅+RnR1sin(θn)Ans=R_1R_2sin(θ_1)+R_2R_3sin(θ_2)+···+R_nR_1sin(θ_n) 最大。

  • 其中 θθ 满足条件:θ1+θ2+⋅⋅⋅+θn=2πθ_1+θ_2+···+θ_n=2π 。

  • 运用 拉格朗日乘数法,我们可以得出拉格朗日乘子

    λ=R1R2cos(θ1)=R2R3cos(θ2)=⋅⋅⋅=RnR1cos(θn)

    λ=R_1R_2cos(θ_1)=R_2R_3cos(θ_2)=···=R_nR_1cos(θ_n)

  • 因为 θi∈(0,π)θ_i∈(0,π) (超过了必然不会更优),又 cos(θ)cos(θ) 在 [0,π][0,π] 上单调递减。

  • 于是我们可以通过单调性二分出一个最小的 λλ 满足 θ1+θ2+⋅⋅⋅+θn=2πθ_1+θ_2+···+θ_n=2π 。

  • 接着由 θi=arccos(λRiRi+1)θ_i=arccos(\frac{λ}{R_iR_{i+1}}) 就可以算出每个 θiθ_i 。

  • 最后统计答案即可,时间复杂度 O(N!∗N∗logAns)O(N!*N*logAns) 。

  • 附:拉格朗日乘数法的一般步骤如下(以此题为例):

    1. 设出目标函数 f(R1,⋅⋅⋅,Rn)=∑RiRi+1sin(θi)f(R_1,···,R_n)=\sum{R_iR_{i+1}sin(θ_i)}

    2. 设出条件函数 g(R1,⋅⋅⋅,Rn)=∑Ri−2π=0g(R_1,···,R_n)=\sum{R_i}-2π=0

    3. 再设出拉格朗日乘数函数 F(R1,⋅⋅⋅,Rn,λ)=f(R1,⋅⋅⋅,Rn)+λg(R1,⋅⋅⋅,Rn)F(R_1,···,R_n,λ)=f(R_1,···,R_n)+λg(R_1,···,R_n) 。

    4. 之后就可以求出关于每个元的偏导数(其它元看做常数),联立即可求出各个元:

    5. F′θi=RiRi+1cos(θi)+λ=0,F′λ=∑Ri−2π=0F_{θ_i}'=R_iR_{i+1}cos(θ_i)+λ=0 ,F_λ'=\sum{R_i}-2π=0

    6. 使各个偏导数都等于 0 ,解出的解就是最值的解了。

Code

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cctype>
using namespace std;
const double Pi=acos(-1.0),eps=1e-7;
int n,a[10];
double t[10],ans;
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline double check(double x)
{double sum=t[n]=acos(x/a[1]/a[n]);for(int i=1;i<n;i++) sum+=t[i]=acos(x/a[i]/a[i+1]);return sum;
}
int main()
{n=read();for(int i=1;i<=n;i++) a[i]=read();sort(a+1,a+1+n);while(n>=3){do{double l=-1.0*a[1]*a[2],r=-l;while(l+eps<r){double mid=(l+r)/2.0;if(check(mid)>=2*Pi) l=mid+eps; else r=mid-eps;}if(fabs(check(l)-2*Pi)<=eps){double num=sin(t[n])*a[1]*a[n];for(int i=1;i<n;i++) num+=sin(t[i])*a[i]*a[i+1];if(num>ans) ans=num;}}while(next_permutation(a+1,a+1+n));n--;for(int i=1;i<=n;i++) a[i]=a[i+1];}printf("%.7lf",ans/2.0);return 0;
}

JZOJ 5606. 【NOI2018模拟3.27】Yja相关推荐

  1. JZOJ 5603. 【NOI2018模拟3.27】Xjz

    Description 给定字符串 S 和 T. 串A和串B匹配的定义改为:存在一个字符的映射,使得A应用这个映射之后等于B,且这个映射必须为一个排列. A=121, B=313,当映射为{1-> ...

  2. 九星连珠用c语言编程,王者模拟战27号更新:九星连珠不再是梦想 贪婪天赋荣升A级...

    原标题:王者模拟战27号更新:九星连珠不再是梦想 贪婪天赋荣升A级 个人观点:王者荣耀模拟战中要实现三星英雄九星连珠的梦想很难,原因是没有大量金币支持玩家抽卡升三星,而恰恰有天赋贪婪可以轻松实现这个梦 ...

  3. JZOJ 5623. 【NOI2018模拟4.2】program

    Description Input Output Sample Input 10 5 8>6<2<>54< 4 7 1 10 4 4 2 9 8 10 Sample Ou ...

  4. JZOJ 5982. 【WC2019模拟12.27】路径排序

    Description Input Output Sample Input 输入1: 5 3 1 1 4 4 2 1 5 4 3 1 3 1 4 2 4 3 2 输入2: 10 5 4 10 3 6 ...

  5. JZOJ 5931. 【NOIP2018模拟10.27】冒泡排序

    Description 题目背景 冒泡排序的交换次数被定义为交换过程的执行次数. 题面描述 小 S 开始专注于研究⻓度为 n 的排列,他想知道,在你运气足够好的情况下(即每次冒泡排序的交换次数都是可能 ...

  6. JZOJ 5933. 【NOIP2018模拟10.27】百鸽笼

    Description Input 从文件 pigeon.in 中读入数据. 输入第一行包含两个正整数 n, m ,分别表示初始鸽笼数与操作个数. 第二行包含 n 个正整数,第 i 个数表示从左往右第 ...

  7. JZOJ 5932. 【NOIP2018模拟10.27】情报中心

    Description 题目背景 .飞纷火战来年近国 D 和国 C .飞乱子鸽来年近国 D 和国 C 题面描述 最近,C 国成功地渗透进入了 D 国的一个城市.这个城市可以抽象成一张有 n 个节点,节 ...

  8. JZOJ 5643. 【NOI2018模拟4.10】最小代价

    Description 给定一张n个点m条边的无向图,点编号1到n,每个点x有两个权值ax和bx.给定k,选出图中一个大小为k的点集S,使得S中任意两个点之间存在仅经过这个点集中的点的路径.S也存在两 ...

  9. JZOJ 5640. 【NOI2018模拟4.9】劈配

    Description Input Output 输出到文件 mentor.out 中. 按顺序输出每组数据的答案.对于每组数据,输出 2 行: • 第 1 行输出 n 个用空格隔开的正整数,其中第 ...

最新文章

  1. GitHub:TensorFlow、PyTorch最全资料集锦
  2. windows Server 2003   IIS启用父路径
  3. Spring框架版本命名规则
  4. hibernate mysql 性能_MyBatis和Hibernate相比,优势在哪里?
  5. pytorch flatten函数_1. PyTorch中的基本数据类型——张量
  6. C++求解汉字字符串的最长公共子序列 动态规划
  7. 3年flash游戏开发小结
  8. linux如何入侵电脑,Linux超大漏洞,按28次Backspace键即可入侵电脑
  9. html编写在线打字通,HTML5代码打字练习、HTML5案例 - 03
  10. 计算机中的cmd是什么意思,计算机中的cmd是什么意思,全称是什么
  11. 电脑快捷键大全 Alt
  12. Why WebRTC|前世今生
  13. linear-gradient 实现切角效果
  14. Java 实现回文数
  15. APP - 小米/红米电视开机广告屏蔽 hosts 列表分享,轻松解决开机广告
  16. atom可以做php开发吗,atomcode 一个相当牛B的PHP开发框架,可以到网上去搜索文档,就不帖在这儿了 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...
  17. javascript_实现
  18. 奥特斯出席2018重庆市市长国际经济顾问团第十三届年会
  19. 12306火车车次票价查询api
  20. html书签解析,解析netscape样式书签html文件嵌套数组

热门文章

  1. JVM03Java代码执行流程
  2. C++ 中const的用法,特别是用在函数前面与后面的区别!
  3. 【图像】jpg与jpeg的区别
  4. 学习笔记(一)——图像的灰度级和动态范围
  5. [云炬创业学笔记]第二章决定成为创业者测试3
  6. 科大星云诗社动态20210602
  7. 独家干货 | 林轩田机器学习课程精炼笔记!
  8. U-net:实用图像分割、特征提取深度框架
  9. 关于Delphi中TRttiContext.FindType失效的问题
  10. Visual Studio 2008 当页面进行调试时,IE8浏览器显示的是空白页面?