当前位置: 首页 > news >正文

【NOI2018模拟】Yja

【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;
}

转载于:https://www.cnblogs.com/hchhch233/p/10505465.html

相关文章:

  • npm install -g react-native-cli 报错:errno -4048
  • 如何在GitHub上创建个人博客
  • layDay日期格式不合法报错解决
  • 静态路由实验
  • 第2部分 Elasticsearch查询-请求体查询、排序
  • 利用Python绘制一个正方形螺旋线
  • OPPO大数据平台运营研发实践分享
  • 没有一个技术天生完美,MongoDB十年发展全纪录
  • 嵌入式软件架构设计
  • Go之如何提取数字的各个位数?
  • 已开源|码上用它开始Flutter混合开发——FlutterBoost
  • Mybatis的bind动态SQL
  • 【翻译】构建响应式系统-vue
  • 程序是什么?如何理解编程的本质?
  • centos7.5+cobbler2.8.4实战图文攻略--2019持续更新
  • canvas 高仿 Apple Watch 表盘
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • HashMap ConcurrentHashMap
  • HomeBrew常规使用教程
  • JavaScript创建对象的四种方式
  • JavaScript函数式编程(一)
  • Material Design
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Redis在Web项目中的应用与实践
  • Spring框架之我见(三)——IOC、AOP
  • Vue实战(四)登录/注册页的实现
  • 多线程 start 和 run 方法到底有什么区别?
  • 如何设计一个微型分布式架构?
  • 网络应用优化——时延与带宽
  • Semaphore
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​什么是bug?bug的源头在哪里?
  • #if和#ifdef区别
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (一)Java算法:二分查找
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET 8.0 中有哪些新的变化?
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .Net 知识杂记
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • /*在DataTable中更新、删除数据*/
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @SentinelResource详解
  • [ C++ ] STL---string类的模拟实现
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [Android Pro] Notification的使用
  • [ANT] 项目中应用ANT
  • [BSGS算法]纯水斐波那契数列
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [bzoj1324]Exca王者之剑_最小割