poj 1328

来源:互联网 发布:淘宝怎么才能分期付款 编辑:程序博客网 时间:2024/06/14 20:25
贪心第一题。应该上来先把每个岛屿对应的海岸线范围求好,这样以后就只是加减运算比较方便,否则每次都要算乘方开方。注意无解的情况!不要忘了考虑当currentR >当前点的右界时的情况!

最后注意输入要读完再判断是否为-1,其实没读完也可以判断的。。。

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <algorithm>#include <cmath>using namespace std;struct node{    double l;    double r;};bool compare(struct node a,struct node b){    return a.l < b.l;}int main(){    int n,d;    int count = 1;    while(scanf("%d %d",&n,&d) == 2 && n != 0)    {        struct node nodes[1024];        memset(nodes,0,sizeof(nodes));        int i,flag = 0;;        for(i = 0;i < n;++i)        {            int x,y;            scanf("%d %d",&x,&y);            if(d < y)            {                flag = 1;            }            nodes[i].l = x - sqrt(double(1.0 * d * d - y * y));            nodes[i].r = x + sqrt(double(1.0 * d * d - y * y));        }        if(flag)        {            printf("Case %d: -1\n",count++);            continue;        }        sort(&nodes[0],&nodes[n],compare);        int radars = 1;        double currentR = nodes[0].r;        for(i = 1;i < n;++i)        {            if(currentR < nodes[i].l)            {                ++radars;                currentR = nodes[i].r;            }            else if(currentR > nodes[i].r)                currentR = nodes[i].r;        }        printf("Case %d: %d\n",count++,radars);    }    return 0;}




原创粉丝点击