four

来源:互联网 发布:为知笔记vip破解版 编辑:程序博客网 时间:2024/04/30 05:23
题目:有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。

个人理解:其中left小于0且right值对大的那个节点肯定是第一个需要的喷水器,这样当该喷水器去掉之后,该喷水器的边缘到草坪的右边缘就构成了一个新的问题,再重复上面的步骤即可

代码:#include<stdio.h>#include<math.h>typedef struct pen{                     double left,right;//左右边界 }qiang;int main(){    qiang a[10004] = {0};    int N;    scanf("%d",&N);    for(int i=0;i<N;i++){        int n,w,h;        scanf("%d%d%d",&n,&w,&h);        for(int i=0;i<n;i++){            int x,r;            scanf("%d%d",&x,&r);            double z = 0;            if(r>h/2.0)                      z = sqrt(r*r-h*h/4.0);            a[i].left=x-z;            a[i].right=x+z;        }        double b=0,max=0;        int num=0,flag=0;        while(b<w){            for(int j=0;j<n;j++){                if(a[j].left<=b && a[j].right>=b){                    max= max>a[j].right?max:a[j].right;                }            }            if(b == max){                      printf("%d\n",0);                flag = 1;                break;            }            b = max;            num++;        }        if(!flag)            printf("%d\n",num);    }}

原创粉丝点击