10382 - Watering Grass-----------(题目简单)卡精度啊!!wa了8次!

来源:互联网 发布:java工程师武汉工资 编辑:程序博客网 时间:2024/04/29 06:22

精度这个东西好神奇~如果判断一个double的数大于0,直接让这个double跟一个很小的数的负数比较大小~!!!!!!!!!




#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define N 10005#define MIN 1e-11#define M 1000001using namespace std;struct S{    double a,b;};S s[N];int n;double l,w;bool cmp(S x, S y){    return x.a < y.a;}int main(){#ifndef ONLINE_JUDGE    freopen("ex.in","r",stdin);#endif    while(scanf("%d%lf%lf",&n,&l,&w)!=EOF)    {        w/=2;//        double x,ra,xx;        for(int i=0; i<n; i++)        {            scanf("%lf%lf",&x,&ra);            if(ra<=w)            {                s[i].a=-1;                s[i].b=-1;                continue;            }            xx=sqrt(ra*ra-w*w);            s[i].a=x-xx;            s[i].b=x+xx;        }        sort(s,s+n,cmp);        double f,r=0;        int i=0;        for(; i<n; i++)        {            if(s[i].b>0)            {                f=s[i].a;                break;            }        }        int flag=0;        if(f>0)            flag=1;        int cnt=0;        double lg=0;        while(r<l&&!flag)        {            flag=1;//            for(;i<n&&r-s[i].a>MIN; i++)//错了            for(;i<n&&r-s[i].a>-MIN; i++)//-MIN换成MIN就错了            {                if(s[i].b>lg)                {                    lg=s[i].b;                    flag=0;                }            }            r=lg;            cnt++;        }        if(!flag&&lg>=l)//lg>=l别忘        {            printf("%d\n",cnt);        }        else            printf("-1\n");    }    return 0;}