十五月明


私信TA

用户名:dotcpp0605328

访问量:2705

签 名:

等  级
排  名 503
经  验 4442
参赛次数 0
文章发表 68
年  龄 18
在职情况 学生
学  校 曲阜师范大学
专  业 人工智能

  自我简介:

Easy

解题思路:

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分

1 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区