背景
平面上有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
限制
各个测试点1s
提示
如果你用比较复杂的方法AC了,请想一想有没有更加简便的方法。
来源
Ural
开始以为要用正余弦之类的东西。。。
后来发现其实就是一个圆
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include<bits/stdc++.h> 2 #define inf 1000000000 3 #define maxn 1000+5 4 #define maxm 5000000+5 5 #define eps 1e-10 6 #define ll long long 7 #define mod 5000011 8 #define pi 3.1415926 9 #define for0(i,n) for(int i=0;i<=(n);i++) 10 #define for1(i,n) for(int i=1;i<=(n);i++) 11 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 12 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 13 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 14 using namespace std; 15 int read(){ 16 int x=0,f=1;char ch=getchar(); 17 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 18 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 19 return x*f; 20 } 21 double x[maxn],y[maxn]; 22 double r,ans; 23 int n; 24 int main(){ 25 //freopen("input.txt","r",stdin); 26 //freopen("output.txt","w",stdout); 27 n=read(); 28 scanf("%lf %lf %lf",&r,&x[1],&y[1]); 29 for2(i,2,n){ 30 scanf("%lf %lf",&x[i],&y[i]); 31 double a=(x[i]-x[i-1]),b=(y[i]-y[i-1]); 32 ans+=sqrt(a*a+b*b); 33 } 34 double a=(x[n]-x[1]),b=(y[n]-y[1]); 35 ans+=sqrt((double)a*a+b*b)+(double)pi*2*r; 36 printf("%.2f",ans); 37 return 0; 38 }
连double怎么用scanf读都忘了。。。