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;
    }
    

      

  • 相关阅读:
    今天面试一些程序员(新,老)手的体会
    UVA 10635 Prince and Princess
    poj 2240 Arbitrage
    poj 2253 Frogger
    poj 2485 Highways
    UVA 11258 String Partition
    UVA 11151 Longest Palindrome
    poj 1125 Stockbroker Grapevine
    poj 1789 Truck History
    poj 3259 Wormholes
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4626479.html
Copyright © 2011-2022 走看看