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

题解

任意画出集中情况,就可以发现,答案是这些点组成的多边形的周长加上一个半径为R的圆的周长。
代码如下:

#include <cstdio>
#include <cmath>
#define pi acos(-1.0)
int n;
double r, x[110], y[110], res;
int main()
{
    scanf("%d%lf", &n, &r);
    for (int i = 0; i < n; i ++)
        scanf("%lf%lf", &x[i], &y[i]);
    res = 2 * pi * r;
    for (int i = 0; i < n; i ++)
        res += sqrt((x[i]-x[(i+n-1)%n])*(x[i]-x[(i+n-1)%n])+(y[i]-y[(i+n-1)%n])*(y[i]-y[(i+n-1)%n]));
    printf("%.2lf
", res);
    return 0;
}
原文地址:https://www.cnblogs.com/xianyue/p/6951908.html