题解:P3744 李彬的几何
主要思路
其实这个题思路没有那么复杂
为使
考虑对于给定的
容易猜测结论:所求最小距离即为
简证:如图所示:(画质感人)
分别以
若存在直线
回到原题,由于高即为顶点到底边的距离,我们只需枚举所有点对
(显然的)优化:由于其余点到
计算距离使用点到直线距离公式即可。
CODE
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Point{
ll x,y;
} p[1009];
double d(Point p1,Point p2,Point p3){
return abs((p2.x-p3.x)*p1.y-(p2.y-p3.y)*p1.x+p2.y*p3.x-p2.x*p3.y)/sqrt(pow(p2.x-p3.x,2)+pow(p2.y-p3.y,2));
}
ll n,pre[1009],nxt[1009];
double mn=1000000000.0;
int main(){
cin>>n;
for(ll i=1;i<=n;i++){
cin>>p[i].x>>p[i].y;
pre[i]=((i==1)?n:i-1),nxt[i]=((i==n)?1:i+1);
}
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
if(j==i) continue;
if(pre[i]!=j) mn=min(mn,d(p[pre[i]],p[i],p[j]));
if(nxt[i]!=j) mn=min(mn,d(p[nxt[i]],p[i],p[j]));
if(pre[j]!=i) mn=min(mn,d(p[pre[j]],p[i],p[j]));
if(nxt[j]!=i) mn=min(mn,d(p[nxt[j]],p[i],p[j]));
}
}
cout<<mn/2.0<<endl;
return 0;
}
求通过qwq