没想到一道入门贪心题都卡我一上午时间,本来打算不查题解跟它硬刚,后发现实在刚不过。。。。一开始思路就有问题,这道题需要计算左边界和右边界,然后以左边界升序排列数据。样例中的第一组数据就出现了这种情况,然而我并没有意识到。还有,在贪心计算的时候,当下一个的右边界还小于上一个的右边界时,此时边界要向后退,这个也是我没有想到的地方,总之图样图森破了。。。。
Accepted 196K 32MS C++ 1040B
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
double l,r;
};
int cmp(struct node xx,struct node yy)
{
return xx.l<yy.l;
}
int main()
{
int n,j=0;
double d;
while(scanf("%d%lf",&n,&d)&&(n||d))
{
bool flag=true;
struct node a[1050];
for(int i=0; i<n; i++)
{
double x,y;
scanf("%lf%lf",&x,&y);
if(y>d||y<0)flag=false;
a[i].l=x-sqrt((d*d)-(y*y));
a[i].r=x+sqrt((d*d)-(y*y));
}
if(!flag)
{
printf("Case %d: -1\n",++j);
continue;
}
sort(a,a+n,cmp);
int cnt=1;
double t=a[0].r;
for(int i=1; i<n; i++)
{
if(a[i].r<=t)
t=a[i].r;
else if(a[i].l>t)
{
cnt++;
t=a[i].r;
}
}
printf("Case %d: %d\n",++j,cnt);
}
}