题解:P1513 绕钉子的长绳子

题解:P1513 绕钉子的长绳子

前置芝士:计算几何。

思路解析

这是一道计算几何好题,根据题意模拟即可。

首先,我们需要知道两点距离公式,即:

\[\sqrt{(x-x1)^2+(y-y1)^2} \]

用代码表示:

double ojld(double x,double y,double x1,double y1) {
    return sqrt(pow(abs(x1-x),2)+pow(abs(y1-y),2));
}

绝对值可以不加,因为实数的平方永远是正数。

随后,我们需要考虑直线部分的长度。这可以用 for 循环完成,只需计算每两个钉子之间的距离就可以了,不要忘记最后一个钉子和第一个钉子之间的距离。

for(int i=2;i<=n;i++) {
    z+=ojld(x[i-1],y[i-1],x[i],y[i]);
}
z+=ojld(x[1],y[1],x[n],y[n]);

最后,我们需要计算所有的两个钉子之间的连接处的距离。由于题目中明确说过组成的图形为凸多边形,所以所有的两个钉子之间的连接处的距离就是 \(2\pi r\),即:

2*r*3.1415

\(\pi\) 的值要精确一些,否则第三个点会挂。

AC 代码

整合后的代码如下:

#include<bits/stdc++.h>
#define rint register int
#define vfl(a,b,c) for(rint a=(b),a##end=(c);a<=a##end;a++)
#define vfr(a,b,c) for(rint a=(b),a##end=(c);a>=a##end;a--)
#define met(x,y) memset(x,y,sizeof(x))
#define eb emplace_back
#define si(x) (int)((x).size())
#define intma INT_MAX
#define intmi INT_MIN
#define longma LONG_LONG_MAX
#define longmi LONG_LONG_MIN
#define vt vector
#define fr first
#define se second
#define PII pair<int,int>
#define lowbit(x) ((x)&-(x))
using namespace std;
typedef long long ll;
int n;
double r,x[110],y[110],z;
//求任意两个点之间的距离。
double ojld(double x,double y,double x1,double y1) {
    return sqrt(pow(abs(x1-x),2)+pow(abs(y1-y),2));
}
int32_t main() {
    cout<<fixed<<setprecision(2);
    //保留两位小数。
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>r;
    vfl(i,1,n) {
        cin>>x[i]>>y[i];
    }
    vfl(i,2,n) {
        z+=ojld(x[i-1],y[i-1],x[i],y[i]);
    }
    cout<<z+ojld(x[1],y[1],x[n],y[n])/*到这里为止是所有钉子之间的直线距离*/+2*r*3.1415/*这里是所有的两个钉子之间的连接处的距离,正好是一个半径为 r 的圆*/;
    return 0;
}

祝大家可以顺利 AC!

posted @ 2026-02-11 10:32  Lemon_eggplant  阅读(2)  评论(0)    收藏  举报