背景
平面上有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;
}