题意
- 给定若干个点,选哪三个能使得构成三角形的同时,短边长最大
思路
- 读入点,把边存入结构体,记录长度和构成边的两个点,按长度排序,遍历边,每次记录每个点连接了哪几个其它点(使用bitset,用01串来记录联的点的个数),直到有一条边两个顶点已经连的点有交集,该边就是最短边
AC代码(注意bitset的使用)
#include<bits/stdc++.h>
using namespace std;
struct tp{
int x,y;
int len;
}a[16000000];
int cmp(tp x,tp y){
return x.len>y.len;
}
int x[4000],y[4000];
bitset<4000>dt[4000];
int main(){
int n,m=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&x[i],&y[i]);
}
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
a[m].len=(x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]);
a[m].x=i;
a[m].y=j;
m++;
}
}
sort(a,a+m,cmp);
for(int i=0;i<m;i++){
if((dt[a[i].x]&dt[a[i].y])!=0){
printf("%.8lf",sqrt(1.0*a[i].len)/2);
break;
}
dt[a[i].x][a[i].y]=1;
dt[a[i].y][a[i].x]=1;
}
return 0;
}