333E summer earnings(codeforce)

简化问题首先可以发现两个点为圆心做的圆的半径一定是两点距离的一半,其次如果是三个点那么一定是距离最近的两个点的距离的一半作为半径

 把所有的边从大到小排序往一个空间里放直到构建成三角形,最后放的边一定是所有三角形中的最大的最小边

代码:

#include<iostream>
#include<algorithm>
#include<bitset>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 3000;
int x[maxn + 9], y[maxn + 9];
struct ty
{
    int dis;
    int u, v;
};
double distance(int i, int j)
{
    return ((x[i] - x[j]) * (x[i] - x[j])) + ((y[i] - y[j]) * (y[i] - y[j]));
}

bitset <maxn+9>bs[maxn+9];//表示第i个点与哪些点连成线
ty arr[maxn * maxn];
bool cmp(ty a, ty b)
{
    return a.dis > b.dis;
}
int m = 1;
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d %d", &x[i], &y[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            arr[m].u = i;
            arr[m].v = j;
            arr[m++].dis = distance(i, j);

        }
    }
    sort(arr + 1, arr + m, cmp);
    for (int i = 1; i < m; i++)
    {
        int u = arr[i].u, v = arr[i].v;
        if ((bs[u] & bs[v]) != 0)//查看u和v是否连有共同的点,有则证明构成了三角形
        {
            printf("%.8f", (double)sqrt(arr[i].dis) / 2.0);
            return 0;
        }
        else//标记u和v,v和u连线
        {
            bs[v][u] = 1;
            bs[u][v] = 1;
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值