【AtCoder】(square869120Contest #3)E

来源:互联网 发布:java mail 附件 io 编辑:程序博客网 时间:2024/06/05 17:29

传送门:http://s8pc-3.contest.atcoder.jp/tasks/s8pc_3_e

感谢罗大神指点

三角形面积公式S=absin(C)2
用正弦定理换掉ab,得S=2sin(A)sin(B)sin(C)
那么变成统计角个数之类的,满足A+B+C=π
然后计数的时候可以不妨设A < B < C
二分面积枚举A二分B(明显A一定时,BC越接近,面积越大)
然后注意一下等腰和等边的计数即可

#include<cmath>#include<iomanip>#include<iostream>#define A(a,b) S[a]*S[b]*S[n-a-b]*2#define db long doubleusing namespace std;typedef long long ll;ll n,k,tot;int lim,l,r,mid;db S[200005],L,R,Mid,st;int main(){    cout<<setprecision(50);    cin>>n>>k;lim=n/3;st=3.14159265358979/n;    if (n%3==0 && n*(n-1)*(n-2)/6<k+n/3)    {        cout<<"1.29903810568";        return 0;    }    for (int i=1;i<=n;i++) S[i]=sin(i*st);    for (L=0,R=1.29903810568,Mid=(L+R)/2;L+0.0000000000001<R;Mid=(L+R)/2,tot=0)    {        for (int i=1;i<=lim;i++) if (A(i,i)<Mid)        {            for (l=i,r=n-i>>1,mid=l+r+1>>1;l<r;mid=l+r+1>>1) (A(i,mid)<Mid)?l=mid:r=mid-1;            tot+=(l+1-i<<1)-(i+l+l==n?(i==l?3:2):1);        }        if (k<=tot*n) R=Mid;else L=Mid;    }    cout<<L;}
0 0
原创粉丝点击