【AtCoder】(square869120Contest #3)E - 円と三角形 / Circle and Many Triangles

本文介绍了一种解决AtCoder平台上特定三角形面积问题的方法,通过利用正弦定理简化计算,并采用二分查找和计数策略来找到满足条件的三角形组合。

传送门: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 double
using 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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值