【Vijos P1007】绕钉子的长绳子 c++题解

时间:2022-09-06 11:26:48
</pre><h1><strong>背景</strong></h1>平面上有N个圆柱形的大钉子,半径都为R,所有钉子组成一个凸多边形。<p>现在你要用一条绳子把这些钉子围起来,绳子直径忽略不计。</p><p></p><h1>描述</h1><p>求出绳子的长度</p><p></p><h1>格式</h1><p></p><p>输入格式</p><p></p>第1行两个数:整数N(1<=N<=100)和实数R。接下来N行按逆时针顺序给出N个钉子中心的坐标<p>坐标的绝对值不超过100。</p><p></p>输出格式<p>一个数,绳子的长度,精确到小数点后2位。</p><p></p><p></p><p>以逆时针顺序将N个钉子编号为1~N</p><p>dist(i,j)=i号钉子和j号钉子的直线距离</p><p>则Ans=dist(1,2)+dist(2,3)+........+dist(n,1)+2*π*R</p><p></p><p><pre name="code" class="cpp">#include <math.h>
#include <iostream>
#include <iomanip>

#define MaxN 101
#define Pi 3.1415

using namespace std;

class nail{
	public:
		double x,y;
};

int N;
double R,Ans=0.000000;
nail P[MaxN];

void init(){
	cin>>N>>R;
	for (int i=0;i<N;i++) cin>>P[i].x>>P[i].y;
}

void work(){
	int next;
	double a,b;
	Ans+=2.000*Pi*R;
	if (N==1) {
		cout<<fixed<<setprecision(2)<<Ans<<endl;
		return ;
	}
	for (int i=0;i<N;i++){
		next=(i+1)%N;
		a=P[i].x-P[next].x;
		b=P[i].y-P[next].y;
		Ans+=sqrt(a*a+b*b);
	}
	cout<<fixed<<setprecision(2)<<Ans<<endl;
}

int main(){
	init();
	work();
	return 0;
}