uva10382-贪心分析

来源:互联网 发布:壹号人家女装批发淘宝 编辑:程序博客网 时间:2024/06/07 09:12

首先把一个圆转化为区域,用结构体range,存的范围是 [a,b] ;之后对range进行排序,从start=0.0开始枚举a<=0.0的所有范围,找出在这些range中最大的b,之后令start=b,直到b>length;count=-1一共有两种情况:一:中间有地方连接不上,二:到不了最后;(注意要ranges.clear( ) );

#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<vector>using namespace std;const int maxn=1e4+5;const double eps=1e-11;struct Range{    double a;    double b;    bool operator < (const Range &ano)const{        return a<ano.a||(a==ano.a&&b<ano.b);    }};vector <Range> ranges;int main(){    //freopen("int.txt","r",stdin);    int n,l,w;    while(~scanf("%d%d%d",&n,&l,&w)){        ranges.clear();        double length=(double) l,weight=(double) w/2.0;        for(int i=0;i<n;i++){            int position ,radius;            scanf("%d%d",&position,&radius);            if(2*radius<=w)continue;            Range range;            double r=(double) radius,p=(double) position;            double xw=sqrt(r*r-weight*weight);            if(p-xw>length)continue;            range.a=p-xw;            range.b=p+xw;            if(range.a - eps < 0.0) range.a = 0.0;            ranges.push_back(range);        }        sort(ranges.begin(),ranges.end());        double start=.0,end=.0;        int cnt=0;        for(vector<Range>::iterator pr=ranges.begin();pr!=ranges.end();){            start =end;            if(pr->a-start>eps){                cnt=-1;                break;            }            cnt++;            while(pr!=ranges.end()&&pr->a<=start){                if(pr->b-end>eps)end=pr->b;                pr++;            }            if(end-length>eps)break;        }        if(length>end+eps)cnt=-1;        printf("%d\n",cnt);    }    return 0;}


0 0
原创粉丝点击