喷水装置(二) +区间覆盖-基础问题-贪心

本文介绍了一种使用贪心算法解决在数轴上覆盖指定线段的最优化问题。通过将区间按起点排序并选择覆盖当前起点的最长区间,最终实现用最少的区间覆盖整个线段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

贪心:

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



·

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;

struct qu
{
	int x;
		int h;
		double l,r;
} tm[10000+5];
double cmp(qu a,qu b)
{
	return a.l<b.l;
} 
int main()
{
 double t;
 cin>>t;
 while(t--)
 {
	 int n,w,h;
	 cin>>n>>w>>h;
	 int ok=0;
	 int i,j;
	 double t1,t2;
	 for (i=1;i<=n;i++)
	 {
		 scanf("%lf %lf",&t1,&t2);
		 if (t2<h/2)
			 continue;
		 tm[++ok].x=t1;
		 tm[ok].l=t1-sqrt(t2*t2-(h*h*1.0/4.0));
		 tm[ok].r=t1+sqrt(t2*t2-(h*h*1.0/4.0));
		 tm[ok].h=t2;

	 }
	 sort(tm+1,tm+1+ok,cmp);


	 int cun=0;
	 double st=0;
	 for (i=1;i<=ok&&tm[1].l<=st;i++)
	 {
		 
		 double max=0;
		 for (j=i;tm[j].l<=st&&j<=ok;j++)
		 {
			 if (max<tm[j].r)
				 max=tm[j].r;
		 }
		 cun++;
		 st=max;

		 if (st>=w)
			 break;
		 i=j-1;

	 }

 if (st>=w) cout<<cun<<endl;
 else
	 printf("0\n"); 

 }

	
	return 0;
}
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值