BZOJ 4080 Wf2014 Sensor Network 随机化

本文介绍了一种使用随机化贪心算法解决平面内最大点集问题的方法,该方法通过随机序列和局部贪心策略找到满足两点间距离不超过给定阈值的最大点集。代码实现包括点类定义、距离计算、随机化排序和贪心选择过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:给定平面上的n个点,求一个最大的点集,使得两两之间距离不超过d

爆搜T到死,加什么剪枝都没用……

随机化大法好

每次随机一个序列,依次贪心加入,然后更新答案

据说很靠谱?反正写完直接过了

#include <bitset>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 110
using namespace std;
typedef bitset<M> abcd;
struct Point{
    int x,y;
    friend istream& operator >> (istream &_,Point &p)
    {
        return scanf("%d%d",&p.x,&p.y),_;
    }
    friend bool operator < (const Point &p1,const Point &p2)
    {
        return p1.x < p2.x ;
    }
    friend int Distance(const Point &p1,const Point &p2)
    {
        return (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) ;
    }
}points[M];
int n,d;
abcd a[M];
abcd now,able,ans;
int main()
{
    int i,j;
    cin>>n>>d;
    for(i=1;i<=n;i++)
        cin>>points[i];
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
            if(Distance(points[i],points[j])<=d*d)
                a[i][j]=a[j][i]=true;
    static int order[M];
    for(i=1;i<=n;i++)
    {
        able[i]=true;
        order[i]=i;
    }
    for(j=1;j<=1000;j++)
    {
        abcd able=::able;
        now.reset();
        for(i=1;i<=n;i++)
            if(able[order[i]])
            {
                now[order[i]]=true;
                able&=a[order[i]];
            }
        if(now.count()>ans.count())
            ans=now;
        random_shuffle(order+1,order+n+1);
    }
    cout<<ans.count()<<endl;
    for(i=1;i<=n;i++)
        if(ans[i])
            printf("%d ",i);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值