Vijos 1007 绕钉子的长绳子

背景

平面上有N个圆柱形的大钉子,半径都为R,所有钉子组成一个凸多边形。

现在你要用一条绳子把这些钉子围起来,绳子直径忽略不计。

描述

求出绳子的长度

格式

输入格式

第1行两个数:整数N(1<=N<=100)和实数R。

接下来N行按逆时针顺序给出N个钉子中心的坐标
坐标的绝对值不超过100。

输出格式

一个数,绳子的长度,精确到小数点后2位。

样例1

样例输入1

4 1
0.0 0.0
2.0 0.0
2.0 2.0
0.0 2.0

样例输出1

 
 

14.28

思路:绳子的长度为2*PI*R+所有相邻点的距离。因为绳子逆时针绕一圈又回到原点所以应该是2*PI*R,不在弧上的点是直线。图下(画的不好不要介意)。下面是C++代码段。sqrt(x*x+y*y)也可以用hypot(double x,double y)来代替。

#include<iostream>
#include<math.h>

using namespace std;
const int N=100;
const double PI=3.1415926;

int main()
{
    int n;
    double r;
    double x_arr[N],y_arr[N];
    cin>>n>>r;
    for(int i=0;i<n;i++)
    {
            cin>>x_arr[i]>>y_arr[i];
    }
    double len=0;
    for(int i=0;i<n-1;i++)
    {
            len=len+sqrt((x_arr[i]-x_arr[i+1])*(x_arr[i]-x_arr[i+1])+(y_arr[i]-y_arr[i+1])*(y_arr[i]-y_arr[i+1]));
    }
    len=len+sqrt((x_arr[0]-x_arr[n-1])*(x_arr[0]-x_arr[n-1])+(y_arr[0]-y_arr[n-1])*(y_arr[0]-y_arr[n-1])) ;
    len=len+2*PI*r;
    
    printf("%.2f\n",len);
    
    

    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_30300695/article/details/80952143