天天看點

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;
}      

轉載于:https://www.cnblogs.com/ALXPCUN/p/4525869.html