题解: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!

浙公网安备 33010602011771号