不得不说,这题是让我饱受折磨,毕竟第一次做贪心算法,而且WA了好多次,幸好有学长的帮助,最终找到了问题所在,是在快排上是问题,double高位不可向int低位转换,由于一开始强制转换导致虽然样例和其他的测试数据过了,但还是WA,现在改完了就对了,附上AC代码,ps:这题通过率是22%,真心不简单
代码如下
#include<stdio.h>
#include<math.h>#include<stdlib.h>
struct point
{
double left,right;
}p[1000], temp;
int cmp(const void *a,const void *b)
{
double t = ((struct point*)a)->left-((struct point*)b)->left;
if(fabs(t)<0.000001)
return 0;
return (t<0.0? -1:1);
}
void main()
{
int n,i,flag;
double r,a,b;
int kase=1;
int countt;
while (scanf("%d%lf",&n,&r)&&(n!=0||r!=0))
{
flag=0;
for (i=0;i<n;i++)
{
scanf("%lf%lf",&a,&b);
if (fabs(b)>r)
{
flag=1;
}
else
{
p[i].left=a*1.0-sqrt(r*r-b*b);
p[i].right=a*1.0+sqrt(r*r-b*b);
}
}
if(flag==1)
{
printf("Case %d: -1\n",kase++);
}
else
{
countt=1;
qsort(p,n,sizeof(p[0]),cmp);
temp=p[0];
for(i=1;i<n;i++)
{
if(p[i].left>temp.right)
{
countt++;
temp=p[i];
}
else if(p[i].right<temp.right)
{
temp=p[i];
}
}
printf("Case %d: %d\n",kase++,countt);
}
}
}