lua 区间比较_区间覆盖问题(贪心) | 学步园

数轴上有n个区间[ai,bi],选择尽量少的区间覆盖一条指定线段[s,t]。

贪心策略:

把各区间按照a从小到大排序,从前向后遍历,然后每次选择从当前起点S开始的最长区间,并以这个区间的右端点为新的起点,继续选择,直到找不到区间覆盖当前起点S或者S已经到达线段末端。

需要注意的是,如果某一区间边界大于s,t的边界,应把它们变成s或t。因为超出的部分毫无意义,同时还会影响对数据的分析。

附代码。

#include

#include

#include

using namespace std;

struct Qujian

{

float a,b;

};

bool cmp(const Qujian& s1,const Qujian& s2)

{

return s1.a < s2.a;

}

int main()

{

Qujian A[10005];

int z,n,w,h,x,r,cnt;

float start,l,__h;

scanf("%d",&z);

while(z--)

{

scanf("%d%d%d",&n,&w,&h);

cnt = start = 0;

__h = h*h*1.0/4;

for(int i=0;i

{

scanf("%d%d",&x,&r);

if(r*r < __h)

{

i--;n--;

continue;

}

l = sqrt(r*r - __h);

A[i].a = x-l > 0 ? x-l : 0;

A[i].b = x+l < w ? x+l : w;

}

sort(A,A+n,cmp);

int i,k = -1;

while(start < w && A[k+1].a <= start)

{

float mmax = -1;

for(i = k+1;A[i].a <= start && i

if(mmax < A[i].b)

{

mmax = A[i].b;

k = i;

}

start = mmax;

cnt++;

}

printf("%d\n",start

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值