题意

  • 给定若干个点,选哪三个能使得构成三角形的同时,短边长最大

思路

  • 读入点,把边存入结构体,记录长度和构成边的两个点,按长度排序,遍历边,每次记录每个点连接了哪几个其它点(使用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;
}