poj解题报告——1328

        不得不说,这题是让我饱受折磨,毕竟第一次做贪心算法,而且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);  
        }  
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值