The 2018 ACM-ICPC Chinese Collegiate Programming Contest B. Rolling The Polygon

通过这个题知道了余弦定理的使用。cos A=(b*b+c*c-a*a)/(2*b*c);   之后通过acos(cos A)就可以得出弧度来了。

弧度乘以半径就是轨距。再把多个轨迹相加就得出答案了。

ac代码:

#include <iostream>
#include <cmath>
using namespace std;

const double PI=acos(-1.0);
struct node
{
    double x;
    double y;
}arr[53],temp;

int main()
{
    int N;
    cin>>N;
    int abc=1;
    while(N--)
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>arr[i].x ;
            cin>>arr[i].y ;
        }
        arr[n]=arr[0]; arr[n+1]=arr[1];
        cin>>temp.x>>temp.y;    // 
        double sum=0;
        for(int i=0;i<n;i++)
        {
            double a=sqrt(pow(arr[i].x-arr[i+2].x ,2)+pow(arr[i].y -arr[i+2].y,2));
            double b=sqrt(pow(arr[i].x-arr[i+1].x ,2)+pow(arr[i].y -arr[i+1].y,2)); 
            double c=sqrt(pow(arr[i+1].x-arr[i+2].x ,2)+pow(arr[i+1].y -arr[i+2].y,2));
            double d=(b*b+c*c-a*a)/(2*b*c);
            double e=acos(d);
            e=PI-e;
            double r=sqrt(pow(arr[i+1].x-temp.x,2)+pow(arr[i+1].y-temp.y ,2));
            sum=sum+e*r;
        }
        cout<<"Case #"<<abc++<<": ";
        printf("%.3f\n",sum);
    }
    return 0;

猜你喜欢

转载自blog.csdn.net/weixin_40799464/article/details/81095452