您的位置:首页 > 其它

poj解题报告——1328

2014-11-15 14:05 357 查看
不得不说,这题是让我饱受折磨,毕竟第一次做贪心算法,而且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);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: