解题思路:

20201025141931610.png



注意事项:整体思路是按照喷头的起始位置从小到大进行排序,然后依次放置喷头,直到覆盖整个地块或者没有剩余的喷头可以放置。



#include<iostream>

#include<algorithm>

#include<cmath>

using namespace std;

struct node

{

    double start,end;

}a[100000];

bool cmp(node x,node y){ return x.start<y.start;}

int main()

{

    int T,n,L,W; cin>>T;

    while(T--)

    {

        cin>>n>>L>>W;

        for(int i=1;i<=n;i++)

        {

            int p,r;    cin>>p>>r;

            a[i].start=0;

            a[i].end=0;//记入为0,就是不满足

            if(r>=W/2.0)//只有宽度足够的才有用,并被算进

            {

                a[i].start=p-sqrt(r*r-W*W/4.0);

                a[i].end=p+sqrt(r*r-W*W/4.0);

            }

        }

        sort(a+1,a+1+n,cmp);

        int cnt=0;

        double t=0;

        bool flag=1;

        while(t<L)

        {

            cnt++;

            double p=t;//将变量p赋值为t,表示上一个放置点的位置

            for(int i=1;a[i].start<=p&&i<=n;i++)

            {

                if(a[i].end>t)   //现在的喷头的end大于上一个喷头的end

                    t=a[i].end;

            }

            if(p==t&&t<L)//p==t表示上一个喷头与这一个喷头一样,即没有喷头了

            {

                flag=0;

                cout<<-1<<endl;

                break;

            }

            

        }

        if(flag==1) cout<<cnt<<endl;

    }

    return 0;

}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论