poj 1328 贪心

这里我犯了几个基础性的错误:在排序比较的时候没有用大于小于号,用的是减号,于是就出现问题

不能用qsort  的原因我也不知道,多用double类型的量

定义结构体数组的时候,如果用了typedef,就需要在结构体外定义数组

d<0的时候在  比较 纵坐标和 d 大小的时候就已经排除在外了

题目的思路:

if(last>a[i].r){
                    last=a[i].r;
                }
                else if(last<a[i].f){
                    last=a[i].r;
                    ans++;
                }
这里维护了一个值  last,这个表示一个区间的右边界,出现的三种情况通过以上的代码筛选得到正确的答案


#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;

typedef struct position{
    double f,r;
}k;
k a[1010];

int cmp(position x,position y)
{
    return x.r<y.r;
}

int main()
{
    int n,d,coun=1;
    double tempa,b;
    while(scanf("%d%d",&n,&d)!=EOF)
    {
        int tag=1;
        if(n==0&&d==0){
            tag=0;
            break;
        }
        for(int i=0;i<n;i++){
            scanf("%lf%lf",&tempa,&b);
            if(b>d||tag==0){
                tag=0;
                continue;
            }
            double temp=sqrt(d*d-b*b);
            a[i].f=-temp+tempa;
            a[i].r=temp+tempa;
        }

        int ans=1;
        if(tag){
            sort(a,a+n,cmp);
            double last=a[0].r;
            for(int i=1;i<n;i++){
                if(last>a[i].r){
                    last=a[i].r;
                }
                else if(last<a[i].f){
                    last=a[i].r;
                    ans++;
                }
            }

            printf("Case %d: %d\n",coun++,ans);
        }
        else
            printf("Case %d: -1\n",coun++);
    }
    return 0;
}


你可能感兴趣的:(poj 1328 贪心)