1. 程式人生 > >The 2016 ACM-ICPC Asia Dalian Regional Contest

The 2016 ACM-ICPC Asia Dalian Regional Contest

題意:有N個點與原點的距離都是D,那麼將這N個點分別於原點連線得N條線段,現在給出N條線段所有相鄰夾角a1~aN,問N個點組成的凸多邊形的面積是多少。

解析:這個題目很坑,如果用餘弦定理求出三角形的邊長,再用海倫公式就是WrongAnswer,可能是精度不夠。換成用公式S=1/2*a*b*Sin(c)就能過。

程式碼(0ms)

#include <bits/stdc++.h>
using namespace std;
const double PI=acos(-1.0);

double angle(double x)//角度轉弧度
{
    return (x*PI/180.0);
}

int N,DD;
double aa;

int main()
{
    while(cin>>N>>DD)
    {
        double ans=0,D=1.0*DD;
        for(int i=1;i<=N;i++)
        {
            cin>>aa;
            double ta=D*D*sin(angle(aa))/2;
            ans+=ta;
        }
        cout<<fixed<<setprecision(3)<<ans<<endl;

    }
    return 0;
}

餘弦公式的WongAnswer程式碼:

#include <bits/stdc++.h>
using namespace std;
const double PI=acos(-1.0);

double area(double a,double b,double c)//海倫公式
{
    double p=(a+b+c)/2.0;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}

double angle(double x)//角度轉弧度
{
    return (x*PI/180.0);
}

int N,DD;
double aa;

int main()
{
    while(cin>>N>>DD)
    {
        double ans=0,D=1.0*DD;
        for(int i=1;i<=N;i++)
        {
            cin>>aa;
            double ta=sqrt(D*D+D*D-2.0*D*D*cos(angle(aa)));
            ans+=area(ta,D,D);
        }
        cout<<fixed<<setprecision(3)<<ans<<endl;

    }
    return 0;
}