VJ 1007 绕钉子的长绳子
背景
平面上有N个圆柱形的大钉子,半径都为R,所有钉子组成一个凸多边形。
现在你要用一条绳子把这些钉子围起来,绳子直径忽略不计。
描述
求出绳子的长度
格式
输入格式
第1行两个数:整数N(1<=N<=100)和实数R。
接下来N行按逆时针顺序给出N个钉子中心的坐标
坐标的绝对值不超过100。
输出格式
一个数,绳子的长度,精确到小数点后2位。
限制
各个测试点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; }