UVA 10382

来源:互联网 发布:好吉他淘宝 编辑:程序博客网 时间:2024/05/21 18:40
//为什么要按左边界进行排序,贪心 #include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;struct Node{    double l,r;};Node water[10005];int n,l,w;int cmp(Node a,Node b){    return a.l<b.l;}int main(){    double p,r;    double len;    while(scanf("%d%d%d",&n,&l,&w)!=EOF){        int num=0;        for(int i=0;i<n;i++){            scanf("%lf%lf",&p,&r);            if(r>w*1.0/2){                len=sqrt(r*r*1.0-w*w*1.0/4);                water[num].l=p-len;                water[num++].r=p+len;            }        }        sort(water,water+num,cmp);        int res=0;        double left=0,right=0;        int i;        //用来标记         bool flag=false;        for(i=0;i<num;i++){            int j=i;            //每次寻找小于左边界的,且右边界最大的值             while(j<num&&water[j].l<=left){                if(right<water[j].r)                    right=water[j].r;                j++;             }            if(j==i)                break;            ++res;            left=right;            i=j-1;                        if(left>=l){                flag=true;                break;            }        }        if(!flag)            printf("-1\n");        else            printf("%d\n",res);    }    return 0;}

原创粉丝点击