绕钉子的长绳子

背景

平面上有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
Copy

样例输出1

14.28
Copy

限制

各个测试点1s

提示

如果你用比较复杂的方法AC了,请想一想有没有更加简便的方法。

来源

Ural

 

开始以为要用正余弦之类的东西。。。

后来发现其实就是一个圆

 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 }
View Code

连double怎么用scanf读都忘了。。。

转载于:https://www.cnblogs.com/htwx/articles/7259869.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值