您的位置:首页 > 其它

Problem L

2016-03-27 16:30 190 查看
简单题意

要在岸边建设若干雷达,使得在海中的岛屿能在雷达的信号范围是之内,求出建设雷达的最少数量。

解题思路形成过程

首先先要求出每个岛屿对应雷达建设的范围,也就是以每个岛屿为圆心,画圆,之后求出与坐标轴的焦点(一般是两个),这样就变成了安排的问题,和节目安排差不多,不过贪心选择不一样。

感想

就是在想贪心标准的时候,想了很久,什么时候才能计数,思维转不过来,想了好多例子才想出来。

AC代码

#include <iostream>

#include <cmath>

#include <algorithm>

#include <vector>

#include <fstream>

using namespace std;

struct Line{

    double s;

    double f;

};

bool cmp(Line a,Line b){

    return a.s<b.s;

}

int main(){

    //ifstream cin("in.txt");

    int n,d,time=0;

    vector<Line> l;

    Line ll;

    while(cin>>n>>d&&(n||d)){

        time++;

        int x,y,flag=0;

        int cnt=0;

        l.clear();

        for(int i=0;i<n;i++){

            cin>>x>>y;

            if(y>d){

            cnt=-1;//ÊÇ·ñ³¬¹ý¾àÀë

            flag=1;

            break;

            }else{

                ll.s=(double)x-sqrt((double)d*d-y*y);

                ll.f=(double)x+sqrt((double)d*d-y*y);

                l.push_back(ll);

            }

        }

        if(flag){

            cnt=-1;

            cout<<"Case "<<time<<": "<<cnt<<endl;;

            continue;

        }

        sort(l.begin(),l.end(),cmp);

        double preEnd=l[0].f;

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

            if(preEnd>l[i].f)

            preEnd=l[i].f;

            else if(preEnd<l[i].s){

                preEnd=l[i].f;

                cnt++;

            }

        }

        cout<<"Case "<<time<<": "<<cnt<<endl;;

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心算法