VJ 1007 绕钉子的长绳子

背景

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

 

题解:本以为是道简单的数学水题,但是为此WA了N次,现在也不知道原来的代码哪里错了

CODE:

狂WA..

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define REP(i, s, n) for(int i = s; i <= n; i ++)
#define REP_(i, s, n) for(int i = n; i >= s; i --)
#define MAX_N 100 + 10
#define pi 3.1415926

using namespace std;

int main(){
    int n, r;
    double x[MAX_N], y[MAX_N];
    scanf("%d%d", &n, &r);
    REP(i, 1, n) cin >> x[i] >> y[i];
    
    double ans = 0;
    REP(i, 2, n)
        ans += sqrt((x[i] - x[i - 1]) * (x[i] - x[i - 1]) + (y[i] - y[i - 1]) * (y[i] - y[i - 1]));
    
    ans += sqrt((x[1] - x[n]) * (x[1] - x[n]) + (y[1] - y[n]) * (y[1] - y[n]));
    ans += 2.0 * r * pi;
    cout << ans << endl;
    return 0;
}

后来重新写了一个。。A了

#include <iostream>
#include <cstdio>
#include <cmath>
#define REP(i, s, n) for(int i = s; i <= n; i ++)
#define REP_(i, s, n) for(int i = n; i >= s; i --)
#define MAX_N 100 + 10

using namespace std;

int n;
double r, c, l = 0;
double x[MAX_N], y[MAX_N];

int main(){
    cin >> n >> r;
    c = 3.1415926 * 2.0 * r; //cout << c << endl;
    REP(i, 1, n)
        scanf("%lf%lf", &x[i], &y[i]);
    
    int i = 1;
    while (i <= n){
        if (i == n) l += sqrt((x[n] - x[1]) * (x[n] - x[1]) + (y[n] - y[1]) * (y[n] - y[1])),
            i ++;
        else l += sqrt((x[i] - x[i + 1]) * (x[i] - x[i + 1]) + (y[i] - y[i + 1]) * (y[i] - y[i + 1])),
            i ++;
    }
    
    printf("%.2lf\n", l + c);
    return 0;
}

 

posted @ 2015-05-24 15:12  ALXPCUN  阅读(417)  评论(0编辑  收藏  举报