http://acm.hust.edu.cn/vjudge/problem/21419/origin
题目大意:
有一个矩形长 l 宽 w 的草地要洒水,草地上有n个水龙头,每个能洒的范围不一样
问要开多少个水龙头才能完全洒满整个矩形,如果不行输出-1.
比较典型的区间覆盖问题先排序,第i个的区间为【a【i】,b【i】】的话
想要竟可以能少的开水龙头当然是既能覆盖这个区域又要让区间更大
所以下一个水龙头a[i+1]<=b[i],并且b[i+1]要竟可能的大。~这很贪心
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
struct tree
{
double xl,xr;
}point[100005];
int n,l;
double w;
bool com(tree a,tree b)
{return a.xl<b.xl;}
int solve()
{
sort(point,point+n,com);
double r=0;
int ans=0;
int p=0;
while(r<l)
{
int flog=-1;
double rr=r;
while(p<n&&point[p].xl<=r) //左区间要在上一个区间内
{
if(point[p].xr>rr) //更新rr使得竟可能的大
{
flog=p;
rr=point[p].xr;
}
p++;
}
if(flog==-1)
{
return -1;
}
ans++;
r=rr;
}
return ans;
}
int main()
{
while(scanf("%d%d%lf",&n,&l,&w)==3)
{
w=w/2;
for(int i=0;i<n;i++)
{
double a,b;
scanf("%lf%lf",&a,&b);
if(w>=b)
{ point[i].xl=a; point[i].xr=a;}
else
{
double c=sqrt(b*b-w*w);
point[i].xl=a-c;
point[i].xr=a+c;
}
}
int ans=solve();
printf("%d\n",ans);
}
}