题意:
海上有n多岛,在海岸线上(x轴)建一个雷达能覆盖到与它距离不超过d的岛,求覆盖所有岛的最小雷达数。
思路:
一开始把题目看错了,以为是整点才能放的,然后不停的哇,其实思路也错了。简单推一下样例会知道:计算出每个点雷达在x轴上的可控范围,并保存。于是O(n)转化为n个区间,sort一下,求最小覆盖点,坑点(可能只是对于我来说的吧)最后输出的时候-1情况的ca++不要忘记(只能说实在是太菜了,这都能哇好几次,写个博客,记录下我有多蠢)
代码:
#include<cstdio>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn=100006;
struct node{
double l,r;
/*bool operator <(node a)const{
return l<a.l;
}*/
}k[maxn];
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn=100006;
struct node{
double l,r;
/*bool operator <(node a)const{
return l<a.l;
}*/
}k[maxn];
int cmp(node a,node b){
return a.l<b.l;
}
return a.l<b.l;
}
int main(){
int n,d;
int ca=0;
while(~scanf("%d%d",&n,&d),(n+d)){
ca++;
int flag=1;
for(int i=0;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
if(b>d)flag=0;
double t=sqrt(d*1.0*d-1.0*b*b);
k[i].l=a-t;
k[i].r=a+t;
}
if(flag==0)printf("Case %d: -1\n",ca);
else{
int ans=0;
double p=-100000000;
sort(k,k+n,cmp);
/*
for(int i=0;i<n;i++){
printf("x=%.2f y=%.2f\n",k[i].l,k[i].r);
}
*/
for(int i=0;i<n;i++){
if(k[i].l>p){
p=k[i].r ;
ans++;
}else if(k[i].r<p){
p=k[i].r ;
}
}printf("Case %d: %d\n",ca,ans);
}
}
}
int n,d;
int ca=0;
while(~scanf("%d%d",&n,&d),(n+d)){
ca++;
int flag=1;
for(int i=0;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
if(b>d)flag=0;
double t=sqrt(d*1.0*d-1.0*b*b);
k[i].l=a-t;
k[i].r=a+t;
}
if(flag==0)printf("Case %d: -1\n",ca);
else{
int ans=0;
double p=-100000000;
sort(k,k+n,cmp);
/*
for(int i=0;i<n;i++){
printf("x=%.2f y=%.2f\n",k[i].l,k[i].r);
}
*/
for(int i=0;i<n;i++){
if(k[i].l>p){
p=k[i].r ;
ans++;
}else if(k[i].r<p){
p=k[i].r ;
}
}printf("Case %d: %d\n",ca,ans);
}
}
}
ps:姑娘加油!