Radar Installation&&贪心问题

在这里插入图片描述
在这里插入图片描述

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43105110/article/details/89309650