天天看點

Vijos 1007 繞釘子的長繩子背景描述格式樣例1

背景

平面上有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)來代替。

Vijos 1007 繞釘子的長繩子背景描述格式樣例1
#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;
}