【NOI2018模拟】Yja

Description

  在平面上找\(n\)个点,要求这 \(n\)个点离原点的距离分别为 \(r1,r2,...,rn\) 。最大化这\(n\) 个点构成的凸包面积,凸包上的点的顺序任意。

  注意:不要求点全部在凸包上。

Input

  第一行一个整数 \(n\)。

  接下来一行$ n$ 个整数依次表示 \(ri\)。

Output

  输出一个实数表示答案,要求绝对误差或相对误差 \(≤ 10^{-6}\)。

Sample Input

4

5

8

58

85

Sample Output

2970

Hint

【数据范围与约定】

  对于前 \(20%\) 的数据,\(n ≤ 3\);

  对于前$ 40%$ 的数据,\(n ≤ 4\);

  对于另 \(20%\) 的数据,\(r1 = r2 = ... = rn\);

  对于 \(100%\) 的数据,\(1 ≤ n ≤ 8,1 ≤ ri ≤ 1000\)。

前置知识:拉格朗日乘数法:

https://blog.csdn.net/the_lastest/article/details/78136692

我们可以用\(\sum_{i=1}^n i!\)的复杂度枚举凸包的所有情况。因为肯定是选最长的\(i\)条线段,所以不需要\(2^i\)枚举集合。

题目中的几个偏导方程是:

\[\begin{align}
\theta _1+\theta_2+\dots+\theta_n=0\\
r_i*r_{i\%n+1}*cos(\theta _i)+\lambda=0\\
\end{align}
\]

由于\(cos(\theta)\)在\([-\pi,\pi]\)之间是单调递减的,所以我们可以二分\(\lambda\)然后反解出\(\theta_i\)并检验是否满足题意。

如果某个\(\theta_i\)与\(0\)非常接近就应该舍去。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 10
#define eps 1e-9 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} int n;
int r[N];
bool cmp(int a,int b) {return a>b;}
int st[N];
double val[N];
double ans; const double pi=acos(-1); double chk(int n,double ans) {
double tot=0;
for(int i=1;i<=n;i++) {
if(fabs(ans)>fabs(val[i])) {
exit(-1);
}
tot+=acos(-ans/val[i]);
}
if(tot>2*pi+eps) return 1;
else return 0;
} int q[N];
double solve(int n) {
double l,r,mid;
double ans=0;
while(1) {
for(int i=1;i<=n;i++) st[i]=::r[q[i]];
for(int i=1;i<n;i++) val[i]=st[i]*st[i+1];
val[n]=st[n]*st[1];
l=-1e9,r=1e9;
for(int i=1;i<=n;i++) {
l=max(l,-val[i]);
r=min(r,val[i]);
}
while(l+1e-5<r) {
mid=(l+r)/2.0;
if(chk(n,mid)) r=mid-eps;
else l=mid;
}
double now=0;
double angle_tot=0;
for(int i=1;i<=n;i++) {
double angle=acos(-l/val[i]);
if(angle<eps) now-=1e9;
angle_tot+=angle;
now+=val[i]*sin(angle);
}
ans=max(ans,now);
if(!next_permutation(q+1,q+1+n)) break;
}
return ans;
} int main() {
n=Get();
for(int i=1;i<=n;i++) r[i]=Get();
sort(r+1,r+1+n,cmp);
for(int i=3;i<=n;i++) {
for(int j=1;j<=i;j++) q[j]=j;
ans=max(ans,solve(i));
}
cout<<fixed<<setprecision(7)<<ans/2.0;
return 0;
}

【NOI2018模拟】Yja的更多相关文章

  1. 【NOI2018模拟5】三角剖分Bsh

    [NOI2018模拟5]三角剖分Bsh Description 给定一个正 n 边形及其三角剖分,共 2n - 3 条边 (n条多边形的边和n-3 条对角线),每条边的长度为 1. 共 q 次询问,每 ...

  2. JZOJ 5602.【NOI2018模拟3.26】Cti

    JZOJ 5602.[NOI2018模拟3.26]Cti Description 有一个 \(n×m\) 的地图,地图上的每一个位置可以是空地,炮塔或是敌人.你需要操纵炮塔消灭敌人. 对于每个炮塔都有 ...

  3. 【JZOJ5605】【NOI2018模拟3.26】Arg

    题目描述 给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. 解题思路 如何求出一个序列的LIS? 对于二分的方法,每次插入一个数,将它放到第一个 ...

  4. 【JZOJ5603】【NOI2018模拟3.27】Xjz

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

  5. BSOJ5458 [NOI2018模拟5]三角剖分Bsh 分治最短路

    题意简述 给定一个正\(n\)边形及其三角剖分,每条边的长度为\(1\),给你\(q\)组询问,每次询问给定两个点\(x_i\)至\(y_i\)的最短距离. 做法 显然正多边形的三角剖分是一个平面图, ...

  6. NOIP2018 模拟赛(二十二)雅礼NOI

    Preface 这次的题目都是NOI+的题,所以大家的分数都有点惨烈. 依靠T1大力骗分水到Rank2 所以想看正解的话看这里吧 A. 「雅礼NOI2018模拟赛(一) Day1」树 看一眼题目感觉十 ...

  7. 【XSY2968】线性代数

    题目来源:noi2018模拟测试赛(二十二) 毒瘤板题+提答场……真tm爽 提答求最大团,各路神仙退火神仙随机化八仙过海 题意: 题解: 支持双端插入的回文自动机板题 代码: #include< ...

  8. 【XSY2892】【GDSOI2018】谁是冠军

    题目来源:noi2018模拟测试赛(二十三)T3 san 为什么noi模拟赛里会做到省选原题啊…… 题意: Description 有n个人,简单起见把他们编号为1到n,每个人有三项指标分别是攻击力, ...

  9. 【XSY2989】字符串

    题目来源:NOI2018模拟测试赛(二十六) 题解: 首先由于这是个01串,所以反对称串的意思就是这个字符串的后半部分是前半部分的反转且翻转结果: 一个串出现有三种情况:在前半部分,在后半部分或穿过中 ...

随机推荐

  1. IdnentiyServer-使用客户端凭据访问API

    情景如下:一个客户端要访问一个api,不需要用户登录,但是又不想直接暴露api给外部使用,这时可以使用identityserver添加访问权限. 客户端通过clientid和secrect访问iden ...

  2. python之turtle简单绘制学习

    一.方法 1.forward() | fd():向前移动指定的距离.参数:一个数字(integer or float)). turtle.forward(25) 2.backward() | bk() ...

  3. Asp.net 获取访问者IP

    using System.Web; namespace Wxlhjcyy.Public { public class GetIp { public static string IPAddress { ...

  4. linux的 .bashrc文件是干什么的?

    使用man bash命令查看到的联机帮助文件中的相关解释如下: .bashrc - The individual per-interactive-shell startup file. 这个文件主要保 ...

  5. JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏

    摘要: 作者将自己常用的JavaScript模块分享给大家. 原文:JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏 作者:前端小智 Fundebug经授权转载,版权归原作者所有. ...

  6. laravel 数据库操作(表、字段)

    1)创建表(make:migration create),例如创建 articles php artisan make:migration create_articles_table --create ...

  7. Filter防止用户访问一些未被授权的资源

    package com.drp.util.filter; import java.io.IOException; import javax.servlet.Filter; import javax.s ...

  8. SD Consultant Year End Activities

    SD Consultant Year End Activities What are the year ending activities to be done for SAP SD?   S.No ...

  9. Android 布局巧用之include、merge、ViewStub

    原文链接:https://mp.weixin.qq.com/s/bTA2gztUzqvqER2rz56RRQ 相信大家经常听到include.merge.ViewStub这样的标签,官方也提到这三种布 ...

  10. Vue之axios请求数据

    引入文件 <script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js"> ...