贪心,还是做了好久。
各种错误的思路。。。诶。。。
最后还是学习的别人的。。
把问题转化成多个区间内,寻找最少的点,使得每个区间都有至少一点。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct T
{
double x;
double y;
};
T p[1200],l[1200];
bool cmp(T a,T b)
{
return a.x<b.x;
}
int main()
{
int n,prob,i,j,ans,cnt,s,flag;
double d,nowx,tx,ty;
prob=1;
while (1)
{
scanf("%d%lf",&n,&d);
if (n == 0 && d == 0)
{
break;
}
for (i=0; i<n; i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
if (p[i].y > d)
{
d=-999999;
}
}
if (d == -999999)
{
printf("Case %d: %d\n",prob,-1);
prob++;
continue;
}
for (i=0; i<n; i++)
{
l[i].x=p[i].x-sqrt(d*d-p[i].y*p[i].y);
l[i].y=p[i].x+sqrt(d*d-p[i].y*p[i].y);
}
sort(l,l+n,cmp);
ty=l[0].y;
cnt=1;
for (i=1; i<n; i++)
{
if (l[i].x <= ty)
{
ty=ty>l[i].y?l[i].y:ty;
}
else
{
cnt++;
ty=l[i].y;
}
}
printf("Case %d: %d\n",prob,cnt);
prob++;
}
}