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