bzoj4080 Wf2014 Sensor Network 随机化

题意:给你一个点集,让你选出最多的点同时保证任意两个点之间距离不能超过d。
一开始一看见n<=100以为直接暴力加入,然后每一次在已经加入的里面比较,结果WA了。。其实挺明显的,肯定不是最优的啊= =,要保证正确性只能2^100。。。
所以就懵逼了,题解是随机化一个序列以后贪心来,感觉整个人都不好了。。还有这种选学算法= =

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=105+5;
int n,m;
int d,w[N];
bitset<N>ans,now;
bool f[N][N],vis[N];
struct node
{
    int x,y;
}a[N];
inline int getdis(node a,node b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
inline void Rand()
{
    fo(i,1,n)swap(w[i],w[rand()%n+1]);
}
inline void solve()
{
    memset(vis,0,sizeof(vis));
    now.reset();
    fo(i,1,n)
    if (!vis[i])
    {
        now.set(w[i]);
        fo(j,i+1,n)
        if (!f[w[i]][w[j]])vis[j]=1;
    }
    if (now.count()>ans.count())ans=now;
}
int main()
{
    scanf("%d%d",&n,&d);
    fo(i,1,n)
    {
        scanf("%d%d",&a[i].x,&a[i].y);
        w[i]=i;
    }
    fo(i,1,n-1)
    fo(j,i+1,n)
    if (getdis(a[i],a[j])<=d*d)f[i][j]=f[j][i]=1;
    fo(i,1,1000)Rand(),solve();
    printf("%d\n",ans.count());
    fo(i,1,n)if (ans[i])printf("%d ",i);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值