zoukankan      html  css  js  c++  java
  • nyoj 12——喷水装置二——————【贪心-区间覆盖】

    喷水装置(二)

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。
     
    输入
    第一行输入一个正整数N表示共有n次测试数据。
    每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。
    随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。
    输出
    每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。
    如果不存在一种能够把整个草坪湿润的方案,请输出0。
    样例输入
    2
    2 8 6
    1 1
    4 5
    2 10 6
    4 5
    6 5
    样例输出
    1
    2


    解题思路:这个题目最重要的是转化思路,将面积覆盖转化成区间覆盖就可以了。


    /*
    对于区间覆盖:首先定一个起点star。找出排序后起点小于等于star的所有区间,找出
    终点最大的一个区间,作为新的起点star。重复上述操作,得到最少需要的区间数量。        
    */
    #include<bits/stdc++.h>
    using namespace std;
    struct SEG{
        double left,right;
    }seg[10100];
    bool cmp(SEG a,SEG b){
        if(a.left!=b.left)
            return a.left<b.left;
        return a.right>b.right;
    }
    int main(){
        int t,i,j,k,n,w,h,xi,ri,cnt;
        double dx,tmp,star;
        scanf("%d",&t);
        while(t--){
            scanf("%d%d%d",&n,&w,&h);
            tmp=h*h/4.0;    //转化思路,将圆的覆盖面积,转化为线段的区间覆盖
            for(i=0;i<n;i++){
                scanf("%d%d",&xi,&ri);
                dx=ri*ri-tmp;
                if(dx<0){
                    i--,n--;    //技巧
                    continue;
                }
                dx=sqrt(dx);
                seg[i].left=xi-dx;
                seg[i].right=xi+dx;
            }
            //区间覆盖
            sort(seg,seg+n,cmp);
            star=0;cnt=0;k=-1;
            while(star<w&&star>=seg[k+1].left){ 
                double maxx=-1;
                for(i=k+1;i<n&&star>=seg[i].left;i++){
                    if(maxx<seg[i].right){
                        maxx=seg[i].right;
                        k=i;
                    }
                }
                star=maxx;
                cnt++;
            }
            if(star<w) cout<<0<<endl;
            else cout<<cnt<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    电容
    51单片机
    三极管
    Scala 面向对象(八):特质(接口) 一
    Scala 面向对象(七):静态属性和静态方法
    Scala 面向对象(六):面向对象的特征二:继承 (一)
    Scala 面向对象(五):面向对象的特征一:封装性
    Scala 面向对象(四):import
    Scala 面向对象(三):package 包 (二)
    Scala 面向对象(二):package 包 (一) 入门
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4626479.html
Copyright © 2011-2022 走看看