Sample Input
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
Sample Output
Case 1: 2
Case 2: 1
这个题的意思是给出n组坐标和一个半径d,求出最少可以用多少个半径为d,圆心在x轴上的圆围起来。
刚开始看完这道题的时候就想到了贪心,但不知道怎么贪,后来实在不会了百度才明白T^T
首先根据输入情况判断输入的数据是否合适,如果不合适输出-1,如果合适的话求出输入点形成的以自身为圆心,以d为半径的圆与x轴的交点,根据交点贪心。
要注意排序时优先对右端点从小到大排,右端点相同时按照左端点从大到小排。
代码
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
double d,x,y;
struct node //求出的左右端点存在结构体中
{
double a,b;
} arr[1005];
bool cmp(node a,node b) //注意排序规则
{
if(a.b==b.b)
return a.a>b.a;
else
return a.b<b.b;
}
int main()
{
int cas=0; //不要忘了输出时还有Case
while(scanf("%d %lf",&n,&d)!=EOF)
{
cas++;
int flag=0;
if(n==0&&d==0)
break;
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&x,&y);
arr[i].a=x-sqrt(d*d-y*y);
arr[i].b=x+sqrt(d*d-y*y);
if(d<0||d<y)
flag=1;
}
sort(arr,arr+n,cmp);
if(flag)
printf("Case %d: %d\n",cas,-1);
else
{
int ans=1;
double mmp=arr[0].b;
for(int i=1;i<n;i++)
{
if(arr[i].a>mmp)
{
ans++;
mmp=arr[i].b;
}
}
printf("Case %d: %d\n",cas,ans);
}
}
return 0;
}