日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JZOJ 5606. 【NOI2018模拟3.27】Yja

發(fā)布時間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 5606. 【NOI2018模拟3.27】Yja 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Description

在平面上找 n 個點, 要求這 n 個點離原點的距離分別為 r 1 ,r 2 ,…,r n . 最大化這 n 個點構(gòu)成的
凸包面積, 凸包上的點的順序任意.不要求點全部在凸包上

Input

第一行一個整數(shù) n.
接下來一行 n 個整數(shù)依次表示 r i

Output

輸出一個實數(shù)表示答案, 要求絕對誤差或相對誤差 ≤ 10^?6 .

Sample Input

4
5
8
58
85

Sample Output

2970

Data Constraint

對于前 20% 的數(shù)據(jù), n ≤ 3;
對于前 40% 的數(shù)據(jù), n ≤ 4;
對于另 20% 的數(shù)據(jù), r 1 = r 2 = … = r n ;
對于 100% 的數(shù)據(jù), 1 ≤ n ≤ 8, 1 ≤ r i ≤ 1000.

Solution

  • 考慮先暴力枚舉 選幾個點點的相對順序

  • 之后我們要使 Ans=R1R2sin(θ1)+R2R3sin(θ2)+???+RnR1sin(θn) 最大。

  • 其中 θ 滿足條件:θ1+θ2+???+θn=2π

  • 運用 拉格朗日乘數(shù)法,我們可以得出拉格朗日乘子

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

  • 因為 θi(0,π) (超過了必然不會更優(yōu)),又 cos(θ)[0,π] 上單調(diào)遞減。

  • 于是我們可以通過單調(diào)性二分出一個最小的 λ 滿足 θ1+θ2+???+θn=2π

  • 接著由 θi=arccos(λRiRi+1) 就可以算出每個 θi

  • 最后統(tǒng)計答案即可,時間復(fù)雜度 O(N!?N?logAns)

  • 附:拉格朗日乘數(shù)法的一般步驟如下(以此題為例):

  • 設(shè)出目標函數(shù) f(R1,???,Rn)=RiRi+1sin(θi)

  • 設(shè)出條件函數(shù) g(R1,???,Rn)=Ri?2π=0

  • 再設(shè)出拉格朗日乘數(shù)函數(shù) F(R1,???,Rn,λ)=f(R1,???,Rn)+λg(R1,???,Rn)

  • 之后就可以求出關(guān)于每個元的偏導(dǎo)數(shù)(其它元看做常數(shù)),聯(lián)立即可求出各個元:

  • Fθi=RiRi+1cos(θi)+λ=0Fλ=Ri?2π=0

  • 使各個偏導(dǎo)數(shù)都等于 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; }

總結(jié)

以上是生活随笔為你收集整理的JZOJ 5606. 【NOI2018模拟3.27】Yja的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。