简单贪心,差一点就一a了。
就是最小覆盖问题的变种,只不过这里左端点和右端点是圆和strip的长的交点。
少写了个条件i<N,re一次。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define MAX 10010
using namespace std;
int N,all,ok;
double L,W;
struct point
{
double l,r,left,right;
}s[MAX];
double getleft(int index)
{
return s[index].l-sqrt(s[index].r*s[index].r-W*W/4);
}
double getright(int index)
{
return s[index].l+sqrt(s[index].r*s[index].r-W*W/4);
}
int cmp(const void *p,const void *q)
{
return ((struct point *)p)->left-((struct point *)q)->left;
}
void solve()
{
double target=0,max;
int i,j=0,flag;
while(1)
{
if(target>=L)
{
ok=1;
break;
}
max=0,flag=0;
for(i=j;i<N&&s[i].left<=target;i++)
{
if(s[i].r*2<=W)
continue;
flag=1;
if(s[i].right>max)
{
max=s[i].right;
}
}
if(flag==0)
{
ok=0;
break;
}
j=i;
all++;
target=max;
}
if(ok==0)
printf("-1\n");
else
printf("%d\n",all);
}
int main()
{
int i,j;
while(scanf("%d %lf %lf",&N,&L,&W)!=EOF)
{
all=0,ok=0;
for(i=0;i<N;i++)
{
scanf("%lf %lf",&s[i].l,&s[i].r);
s[i].left=getleft(i),s[i].right=getright(i);
}
qsort(s,N,sizeof(s[0]),cmp);
solve();
}
return 0;
}