题解 P1513 【绕钉子的长绳子】

· · 题解

相信各位dalao做这题时都会猜想:绳子的总长S=一根钉子的周长C1+N

边形的周长C2:由于绳子绕过钉子时,绳子所在的直线必定与圆形的钉

子相切(即圆的半径与绳子垂直),顺次连接钉子的圆心形成一个N边

形,设第i个角的度数为ai,则可以将绳子中弯曲的部分视为一段度数为

180-ai的弧(由于相切减2个90度),而N边形内角和为180(n-2),

所以各弧的度数之和=180-a1+180-a2+……180-an=180n-(a1+……an)

=180n-180n+360=360。(终于证完了)

以下为代码 (话糙代码不糙)

#include<bits/stdc++.h> 
using namespace std;
double a[103],r,s=0,b[103];//A为横坐标,B为纵坐标
int n;//没什么好解释
int main()
{cin>>n>>r;
 for(int i=1;i<=n;i++)cin>>a[i]>>b[i];//读入点坐标
 a[n+1]=a[1];
 b[n+1]=b[1];//为计算第1个点到第N个点的距离做准备
 for(int i=1;i<=n;i++)//计算、累加多边形边长
   s+=sqrt((a[i]-a[i+1])*(a[i]-a[i+1])+(b[i]-b[i+1])*(b[i]-b[i+1]));//这是一个漫长的两点距离公式
 printf("%.2lf",s+6.28318*r);//别忘了加上圆的周长
 return 0;
}//第五次写题解求过,请各位dalao多多指教