天天看點

【Vijos P1007】繞釘子的長繩子 c++題解

</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;
}
           

繼續閱讀