POJ1328Radar Installation

本文分享了一道入门级贪心算法题目的解题过程,作者最初尝试独立解决但受挫,通过分析发现需计算左右边界并按左边界排序。文章详细介绍了在遇到下一个右边界小于上一个右边界时需调整边界的解题思路。

没想到一道入门贪心题都卡我一上午时间,本来打算不查题解跟它硬刚,后发现实在刚不过。。。。一开始思路就有问题,这道题需要计算左边界和右边界,然后以左边界升序排列数据。样例中的第一组数据就出现了这种情况,然而我并没有意识到。还有,在贪心计算的时候,当下一个的右边界还小于上一个的右边界时,此时边界要向后退,这个也是我没有想到的地方,总之图样图森破了。。。。

Accepted 196K 32MS C++ 1040B

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
    double l,r;
};
int cmp(struct node xx,struct node yy)
{
    return xx.l<yy.l;
}
int main()
{
    int n,j=0;
    double d;
    while(scanf("%d%lf",&n,&d)&&(n||d))
    {
        bool flag=true;
        struct node a[1050];
        for(int i=0; i<n; i++)
        {
            double x,y;
            scanf("%lf%lf",&x,&y);
            if(y>d||y<0)flag=false;
            a[i].l=x-sqrt((d*d)-(y*y));
            a[i].r=x+sqrt((d*d)-(y*y));
        }
        if(!flag)
        {
            printf("Case %d: -1\n",++j);
            continue;
        }
        sort(a,a+n,cmp);
        int cnt=1;
        double t=a[0].r;
        for(int i=1; i<n; i++)
        {
            if(a[i].r<=t)
                t=a[i].r;
            else if(a[i].l>t)
            {
                cnt++;
                t=a[i].r;
            }
        }
        printf("Case %d: %d\n",++j,cnt);
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值