区间类贪心的理解【雷达设备】

额...虽然看我博客的人不多,但是我还是写了,权当是自己的写笔记吧;

先看题;

区间类贪心的理解【雷达设备】_第1张图片

刚开始我们不难想出一个雷达只能在x轴上建立。

这道题我们可以化简为区间贪心问题,即每个岛 i 都有一个限制范围,雷达只有这个范围才能覆盖到这个岛,我们将每个岛的范围计算出来,并按右端点从小到大排序,于是每个点就变成了x轴上的区间。

做好准备工作后就进行一下操作;

用last记录上一个雷达的位置,初始化为负无穷,ans记录用了多少个雷达;

从0~n-1遍历每个点,记此刻遍历到i;

(1)如果上一个点在i区间中,则跳过;

(2)如果上一个点不在i区间中,则在i区间的右端点建立一个雷达,即last更新为i区间的右端点,且ans++;

时间复杂度是排序的o(nlogn)很优秀,1000个数据实在是不够看;

说实话还有一道和这个差不多的题目,抽象出来就是给你n个区间,让你算出最多可以有多少个不相交的区间;

那么接下来就是代码环节了;

#include
#include
#include
using namespace std;

struct p{
    double l,r;
};

vector

sto; double d; int n; int ans; bool cmp(p a,p b){ return b.r>a.r; } int main(){ cin>>n>>d; for(int i=0;i>x>>y; double len=sqrt(fabs(d*d-y*y));//计算区间 double l=x-len,r=x+len; sto.push_back({l,r}); if(y>d){//如果有不可能的区间则直接cout-1; cout<<-1; return 0; } } sort(sto.begin(),sto.end(),cmp);//按右端点排序 double last=-101000;//更新初始化last for(int i=0;isto[i].r||last

你可能感兴趣的:(贪心算法,算法,leetcode)