【2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛】D题 Thinking-Bear magic ---- 计算几何

题目链接 ---- Thinking-Bear magic

做法:我们通过分析,可以发现n边形的内n多边形(即按照题意描述,把各边的中点连接起来形成的新的n多边形)

把n边形的边长称为old_a,n边形的边长称为new_a,角度设为d

d = (n-2)*180

new_a = old_a * sin(1/2*j/180*PI);

根据多边形的面积公式S = n*a*a/(4*tan(PI/n))

可以通过迭代,求得答案。

这里有个技巧:如果每次重新算newa 我们会发现重复计算,我们发现new_a是old_a 某倍,所以我们把倍数求一次,再不断迭代即可。

AC代码: 

#include<bits/stdc++.h>
using namespace std;
const double PI = 3.1415926535;
const double eps = 1e-8;
double cul(double n,double oa,double l)
{
    double j;
    double na;
    j = (n-2)*180/(n);
    j /=2;
    na = oa*sin(j/180*PI);
    return na;
}
int main()
{
    #ifdef LOCAL_FILE
    freopen("in.txt","r",stdin);
    #endif // LOCAL_FILE
    ios_base::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        double n;
        double a,l,s;
        cin>>n>>a>>l;
        s = n*a*a/(4*tan(PI/n));
        //cout<<s<<endl;
        int sum = 0;
        double nns = s;
        double na = cul(n,a,l);
        double be = na/a;
        while(nns>l)
        {
            nns = n*na*na/(4*tan(PI/n));
            na = be*na;
            sum++;
        }
        cout<<sum<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37624640/article/details/81435418