uva10382Watering Grass

来源:互联网 发布:昆仑数据科技面试 编辑:程序博客网 时间:2024/04/30 11:58

简单贪心,差一点就一a了。

就是最小覆盖问题的变种,只不过这里左端点和右端点是圆和strip的长的交点。

少写了个条件i<N,re一次。

#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#define MAX 10010using namespace std;int N,all,ok;double L,W;struct point{    double l,r,left,right;}s[MAX];double getleft(int index){    return s[index].l-sqrt(s[index].r*s[index].r-W*W/4);}double getright(int index){    return s[index].l+sqrt(s[index].r*s[index].r-W*W/4);}int cmp(const void *p,const void *q){    return ((struct point *)p)->left-((struct point *)q)->left;}void solve(){    double target=0,max;    int i,j=0,flag;    while(1)    {        if(target>=L)        {            ok=1;            break;        }        max=0,flag=0;        for(i=j;i<N&&s[i].left<=target;i++)        {            if(s[i].r*2<=W)                continue;            flag=1;            if(s[i].right>max)            {                max=s[i].right;            }        }        if(flag==0)        {            ok=0;            break;        }        j=i;        all++;        target=max;    }    if(ok==0)        printf("-1\n");    else        printf("%d\n",all);}int main(){    int i,j;    while(scanf("%d %lf %lf",&N,&L,&W)!=EOF)    {        all=0,ok=0;        for(i=0;i<N;i++)        {            scanf("%lf %lf",&s[i].l,&s[i].r);            s[i].left=getleft(i),s[i].right=getright(i);        }        qsort(s,N,sizeof(s[0]),cmp);        solve();    }    return 0;}


0 0
原创粉丝点击