• 1424:【例题3】喷水装置


    1424:【例题3】喷水装置


    时间限制: 1000 ms         内存限制: 65536 KB
    提交数: 1122     通过数: 66 

    【题目描述】

    长 LL 米,宽 WW 米的草坪里装有 nn 个浇灌喷头。每个喷头都装在草坪中心线上(离两边各 W2W2 米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。

    请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?

    【输入】

    输入包含若干组测试数据。

    第一行一个整数 TT 表示数据组数;

    每组数据的第一行是整数 nn、LL 和 WW;

    接下来的 nn 行,每行包含两个整数,给出一个喷头的位置和浇灌半径(上面的示意图是样例输入第一组数据所描述的情况)。

    【输出】

    对每组测试数据输出一个数字,表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开也不能浇灌整块草坪,则输出 1−1 。

    【输入样例】

    3
    8 20 2
    5 3
    4 1
    1 2
    7 2
    10 2
    13 3
    16 2
    19 4
    3 10 1
    3 5
    9 3
    6 1
    3 10 1
    5 3
    1 1
    9 1

    【输出样例】

    6
    2
    -1

    【提示】

    数据范围:

    对于 100% 的数据,n≤15000。

    贪心;

    结构体存每个喷头的前后到达位置;

    以前端位置排序;

    一个个扫描可以到达之前的后端,并且自己可以到达最远的后端;

    分析不成立的情况;

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,cnt,L,h,x,r;
    struct SEG{
        double x,y;
    }a[20005];
    bool cmp(const SEG &x,const SEG &y){
        return x.x<y.x;
    }
    void Read(){
        cin>>n>>L>>h;
        cnt=0;
        for(int i=1;i<=n;i++){
            cin>>x>>r;
            if(r<=h/2) continue;
            cnt++;
            a[cnt].x=x-sqrt(r*r-h*h/4.0);
            a[cnt].y=x+sqrt(r*r-h*h/4.0);
        }
    }
    void solve(){
        double t=0;
        int ans=0,bj=1,i=1;
        while(t<L){                        //顺序扫描 
            ans++;
            double s=t;
            for(;a[i].x<=s&&i<=cnt;i++)//依次找到覆盖l的最大右端 
            if(t<a[i].y) t=a[i].y;
            if(t==s&&s<L){
                cout<<-1<<endl;
                bj=0;
                break;
            }                            //无解判断 
        }
        if(bj) cout<<ans<<endl;
    }
    int main(){
        int T;
        cin>>T;
        while(T--){
            Read();
            sort(a+1,a+1+cnt,cmp);
            solve();
        }
        return 0;
    }
  • 相关阅读:
    使用canvas技术在网页上绘制鲜花
    java连接Access数据库
    L2-009. 抢红包
    L2-008. 最长对称子串
    L1-032. Left-pad
    L1-016. 查验身份证
    L1-005. 考试座位号
    L1-030. 一帮一
    L1-023. 输出GPLT
    L1-028. 判断素数
  • 原文地址:https://www.cnblogs.com/yfr2zaz/p/10499519.html
Copyright © 2020-2023  润新知