【BZOJ4080】【WF2014】Sensor Network [随机化]

Sensor Network

Time Limit: 2 Sec  Memory Limit: 128 MB
[Submit][Status][Discuss]

Description

  魔法炮来到了帝都,除了吃特色菜之外,还准备去尝一尝著名的北京烤鸭。
  帝都一共有n个烤鸭店,可以看成是二维平面内的点。
  不过由于魔法炮在吃烤鸭之前没有带钱,所以吃完烤鸭之后只能留下刷盘子。
  刷完盘子之后,魔法炮除了不用付饭费之外,老板还会奖励他d元钱。
  魔法炮是一个特么喜欢吃烤鸭的孩子,所以在去过一家烤鸭店之后,魔法炮还准备去其他的烤鸭店。
  但是由于帝都路费较贵,每单位长度需要花费1元钱,所以魔法炮可能去不了所有其他的烤鸭店。
  在到达下一家烤鸭店之前,魔法炮会花掉手里所有钱,以便于下一次接着吃霸王餐。
  另外,魔法炮对于自己刷过盘子的烤鸭店有着特殊的感情,所以他要求在某一家烤鸭店吃完烤鸭后,可以到达全部已经吃过去过的烤鸭店。
  那么问题来了,魔法炮想知道自己最多能去多少家烤鸭店,以及这些烤鸭店都是哪些。你能帮帮他吗?

Input

  第一行两个整数n和d,分别表示烤鸭店数和老板给魔法炮的路费。
  接下来n行,每行两个整数x,y,表示n个烤鸭店的坐标。

Output

  第一行一个数m,表示魔法炮最多能去多少家烤鸭店。
  第二行m个数,每个数表示魔法炮能去的烤鸭店标号。

Sample Input

  4 1
  0 0
  0 1
  1 0
  1 1

Sample Output

  2
  1 2

HINT

  1<=n<=100  1<=d<=10000  -10000<=x,y<=10000

Main idea

  给定平面内的n个点,选出一个点集S,使得S里的所有点两两之间欧几里得距离不超过d,问|S|的最大值以及S里的点都有哪些。若答案有多种,输出任意一个。

Source

  我们看到了n<=100,立马想到了随机化算法,我们用随机化的方法来求最大团,然后用一个bitset来记录一下方案即可。

Code

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<cmath>
 8 #include<bitset>
 9 using namespace std;
10
11 const int ONE=101;
12
13 bitset <ONE> A,Ans_bit;
14
15 int n,d;
16 int Num[ONE],E[ONE][ONE];
17 int Ans;
18 int vis[ONE];
19
20 struct power
21 {
22         int x,y;
23 }a[ONE];
24
25 int get()
26 {
27         int res=1,Q=1;char c;
28         while( (c=getchar())<48 || c>57 )
29         if(c==‘-‘)Q=-1;
30         res=c-48;
31         while( (c=getchar())>=48 && c<=57 )
32         res=res*10+c-48;
33         return res*Q;
34 }
35
36 bool PD(power a,power b)
37 {
38         return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) <= d * d;
39 }
40
41 void Rand()
42 {
43         for(int i=1;i<=n;i++)
44             swap(Num[i], Num[rand()%n+1]);
45 }
46
47 void Deal()
48 {
49         int res=0;
50         memset(vis,0,sizeof(vis));
51         A.reset();
52
53         for(int i=1;i<=n;i++)
54         if(!vis[i])
55         {
56             res++;
57             A.set(Num[i]);
58
59             for(int j=i+1;j<=n;j++)
60                 if(!E[Num[i]][Num[j]]) vis[j]=1;
61         }
62
63         if(Ans < res)
64         {
65             Ans = res;
66             Ans_bit = A;
67         }
68 }
69
70 int main()
71 {
72         n=get();    d=get();
73         for(int i=1;i<=n;i++)
74         {
75             a[i].x=get();    a[i].y=get();    Num[i]=i;
76         }
77
78         for(int i=1;i<=n;i++)
79         for(int j=i+1;j<=n;j++)
80         {
81             E[i][j] = E[j][i] = PD(a[i],a[j]);
82         }
83
84         for(int i=1;i<=1000;i++)
85             Rand(), Deal();
86
87
88         printf("%d\n",Ans);
89         for(int i=1;i<=n;i++)
90             if(Ans_bit[i]) printf("%d ",i);
91 }

时间: 2024-10-23 01:27:44

【BZOJ4080】【WF2014】Sensor Network [随机化]的相关文章

【BZOJ4080】[Wf2014]Sensor Network 随机化

[BZOJ4080][Wf2014]Sensor Network Description 魔法炮来到了帝都,除了吃特色菜之外,还准备去尝一尝著名的北京烤鸭.帝都一共有n(1<=1<=100)个烤鸭店,可以看成是二维平面内的点.不过由于魔法炮在吃烤鸭之前没有带钱,所以吃完烤鸭之后只能留下刷盘子.刷完盘子之后,魔法炮除了不用付饭费之外,老板还会奖励他d(1<=d<=10000)元钱.魔法炮是一个特么喜欢吃烤鸭的孩子,所以在去过一家烤鸭店之后,魔法炮还准备去其他的烤鸭店.但是由于帝都路费

【随机化】bzoj4080 [Wf2014]Sensor Network

#include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef double db; struct Point{int x,y,p;}p[101],path[101]; int n,m,ans,apa[101]; int sqr(int x){return x*x;} int dis(Point a,Point b){return sqr(a.x-b.x)+sqr(a.y

BZOJ 4080 Wf2014 Sensor Network 随机化

题目大意:给定平面上的n个点,求一个最大的点集,使得两两之间距离不超过d 爆搜T到死,加什么剪枝都没用-- 随机化大法好 每次随机一个序列,依次贪心加入,然后更新答案 据说很靠谱?反正写完直接过了 #include <bitset> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 110 using namespace

泛在传感器网络(Ubiquitous Sensor Network; USN)

http://wiki.mbalib.com/wiki/%E6%B3%9B%E5%9C%A8%E4%BC%A0%E6%84%9F%E5%99%A8%E7%BD%91%E7%BB%9C 什么是泛在传感器网络 泛在传感器网络是指由智能传感器结点组成的网络,可以以“任何地点.任何时间.任何人.任何物”的形式部署.该技术具有巨大的潜力,可用于在广泛领域内推动新的应用和服务,从安全保卫.环境监控到推动个人生产力和增强国家竞争力. [编辑] 泛在传感器网络的提出 此定义出自2008年2月ITU—T的研究报告

Coremicro Reconfigurable Embedded Smart Sensor Node

A Coremicro Reconfigurable Embedded Smart Sensor Node has the capability of hosting intelligent algorithms to support health monitoring applications and has optional standardized software communications stack. The purpose of this present invention is

Indexing Sensor Data

In particular embodiments, a method includes, from an indexer in a sensor network, accessing a set of sensor data that includes sensor data aggregated together from sensors in the sensor network, one or more time stamps for the sensor data, and metad

Network management system scheduling for low power and lossy networks

In one embodiment, a network management system (NMS) determines an intent to initialize a request-response exchange with a plurality of clients in a low power and lossy network (LLN). In response, the NMS adaptively schedules corresponding responses

Methods for Using Message Queuing Telemetry Transport for Sensor Networks to Support Sleeping Devices

Methods support a sleep mode for an embedded device. Embedded devices like sensors and actuators used in wireless sensor networks have a limited power supply. To conserve energy and thus increase the lifetime of these devices, the devices should be p

线性时间O(n)内求数组中第k大小的数

--本文为博主原创,转载请注明出处 因为最近做的WSN(wireless sensor network)实验要求用3个传感器节点接受2000个包的数据并算出一些统计量,其中就有算出中位数这么一个要求,且其按算出数据的时间长短排名给分,所以就在考虑一个线性时间的求第k大小的数的算法. 鉴于传感器只有10k的内存,以及考虑到快排的过程利于简化,所以采用快速排序(以及由之前课程中做的排序算法的测试得知,快排在相同时间复杂度的排序中有较大的优越性,最重要的就是快排好写). 算法基本思想 快速排序的思想就