简单题意
要在岸边建设若干雷达,使得在海中的岛屿能在雷达的信号范围是之内,求出建设雷达的最少数量。
解题思路形成过程
首先先要求出每个岛屿对应雷达建设的范围,也就是以每个岛屿为圆心,画圆,之后求出与坐标轴的焦点(一般是两个),这样就变成了安排的问题,和节目安排差不多,不过贪心选择不一样。
感想
就是在想贪心标准的时候,想了很久,什么时候才能计数,思维转不过来,想了好多例子才想出来。
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;
}