感受
思路
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 3e3 + 10; struct node{ ll dis; int u, v; bool operator < (const node& b)const{ return dis < b.dis; } }e[maxn * maxn]; bitset<maxn> bit[maxn], tmp; pair<ll, ll> p[maxn]; int n, cnt; ll get(int u, int v){ return (p[u].first - p[v].first) * (p[u].first - p[v].first) + (p[u].second - p[v].second) * (p[u].second - p[v].second); } void init(){ for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(i != j) bit[i].set(j, true); } } } int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%lld%lld", &p[i].first, &p[i].second); } for(int i = 1; i <= n; i++){ for(int j = i + 1; j <= n; j++){ e[++cnt] = (node){get(i, j), i, j}; } } init(); sort(e + 1, e + cnt + 1); int u, v; ll ans = 0; for(int i = 1; i <= cnt; i++){ u = e[i].u, v = e[i].v; tmp = bit[u] & bit[v]; if(tmp.any()) ans = e[i].dis; bit[u].set(v, false); bit[v].set(u, false); } printf("%.20f\n", sqrt(ans) / 2.0); return 0; }