luogu P1325 雷达安装】的更多相关文章

题目描述 描述: 假设海岸线是一条无限延伸的直线.它的一侧是陆地,另一侧是海洋.每一座小岛是在海面上的一个点.雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d.你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内. 数据使用笛卡尔坐标系,定义海岸线为x轴.在x轴上方为海洋,下方为陆地. 样例1如图所示 输入输出格式 输入格式: 第一行包括2个整数n和d,n是岛屿数目,d是雷达扫描范围. 接下来n行为岛屿坐标. 输出格式: 一个整数表示最少需要的雷达数目,若不可能覆盖所有岛…
P1325 雷达安装 题目描述 描述: 假设海岸线是一条无限延伸的直线.它的一侧是陆地,另一侧是海洋.每一座小岛是在海面上的一个点.雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d.你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内. 数据使用笛卡尔坐标系,定义海岸线为x轴.在x轴上方为海洋,下方为陆地. 输入输出格式 输入格式: 第一行包括2个整数n和d,n是岛屿数目,d是雷达扫描范围. 接下来n行为岛屿坐标. 输出格式: 一个整数表示最少需要的雷达数目,若不可能覆盖…
传送门 //p1325雷达安装 //很明显雷达应该安装在海岸线上 //而为了满足一个点被覆盖那在区间[x - sqrt(d ^ 2 - y ^ 2), x + sqrt(d ^ 2 - y ^ 2)]之中必有一个雷达 //现在就转换为一个区间覆盖问题:选尽量少的点使得每一个区间之内都有一个点 //把这些区间按右端点排序,记录last为上次雷达安装的点,若一个区间的左端点>last,那这个区间就不能被之前的点覆盖 //更新last=该区间的右端点(贪心选择,右端点有几率覆盖更多的区间),ans++…
传送门 思路: 采取贪心的思想. 把每个岛屿看作圆心,以雷达的范围 d 为半径,求出与 x 轴的左右两个交点,两交点所夹的区间就需要放置一个雷达,这样就把这道题转换为了区间取点问题.在枚举岛屿时,记录之前最后一个雷达安放的位置 las ,如果岛屿在这个雷达的范围内,就跳过,否则,在该岛屿所在的区间右端点放一个雷达. 为了代码比较好看,我打了一个巨大的结构体. 主函数部分: int main() { n=T.resd();d=T.read(); ;i<=n;i++) { t[i].x=T.read…
题目链接 题意 在\(x\)轴上方有\(n\)个海岛,要在\(x\)轴建雷达,每个雷达的覆盖范围为半径为\(d\)的圆,问至少要建多少个雷达能覆盖所有海岛. 思路 对于每个海岛计算出雷达建立在什么范围(\(x\)轴上的一条线段)内能覆盖到它.排序并计算线段的交. Code #include <bits/stdc++.h> #define inf 0x3f3f3f3f #define maxn 200010 using namespace std; typedef long long LL; s…
题目 考虑对于一个小岛,如果有雷达可以覆盖它,则这些雷达肯定在一个区间里,则原题内容则变为区间选点问题 #include <bits/stdc++.h> using namespace std; int n, d, cnt; struct data { double l, r; }a[1001000]; bool cmp(data a, data b) { if (a.r == b.r) return a.l > b.l; return a.r < b.r; } map <i…
Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放了一批共 m 个补丁程序.每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又不包含另一些错误时才可以使用.一个补丁在排除某些错误的同时,往往会加入另一些错误.换句话说,对于每一个补丁 i,都有 2 个与之相应的错误集合 B1[i]和 B2[i],使得仅当软件包含 B1[i]…
题目描述 描述: 假设海岸线是一条无限延伸的直线.它的一侧是陆地,另一侧是海洋.每一座小岛是在海面上的一个点.雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d.你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内. 数据使用笛卡尔坐标系,定义海岸线为x轴.在x轴上方为海洋,下方为陆地. 样例1如图所示 输入格式 第一行包括2个整数n和d,n是岛屿数目,d是雷达扫描范围. 接下来n行为岛屿坐标. 输出格式 一个整数表示最少需要的雷达数目,若不可能覆盖所有岛屿,输出“-1”.…
原题链接 经典贪心,转化为问题为,对于所有的区间,求最小的点数能使每个区间都至少有一个点. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std; const int MAXN=100000+5; const double eps=0.00…
装雷达 题目大意,就是令在海岸线的(直线)一边是海(y>0),另一边是陆地(y<=0),在海岸线上装雷达,雷达可以覆盖的范围为d,海上有岛,(x,y),问你应该怎么装雷达,才能做到技能雷达的检测范围覆盖全部的岛,又能使雷达安装最少?(不能做到输出-1) 我的思路,首先是把岛排一次序,然后从x坐标最小的那个岛开始贪心算法,怎么做呢?那就是用x=sqrt(d*d-y*y)+xa,来获得当前岛的安装最远的雷达的位置,然后不断往前找,在超越当前雷达圆心距离之前,不断缩小雷达的位置,使雷达能覆盖到更多的…