JZOJ 5606. 【NOI2018模拟3.27】Yja
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)+λ=0,F′λ=∑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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5602. 【NOI2018模
- 下一篇: JZOJ 5609. 【NOI2018模