题解 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多多指教