POJ1328Radar Installation(贪心)

参考了下列链接中的情况1做出来的http://blog.csdn.net/chenguolinblog/article/details/7882316

基本思路:核心就是贪心算法。

(1)先把 以每个小岛i为圆心作圆后与x轴相交的得到的left,right存到对应的dis[i]数组中;
(2)然后按升序排好dis数组;
(3)设置一个新的变量tmp 与 dis数组进行比较。倘若tmp.right<dis[i].left,则说明应该再新增一个雷达(注意:tmp只有满足在dis[i]左边的情况下才可能有上述条件成立),否则继续找下一个满足题意的情况,直至结束。

另外还需注意一下判错的条件d<0 || MAX>d
ps:需要算上最开始满足题意的第一个雷达,所以最后输出的答案是ans+1.

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#define N 1000
using namespace std;
typedef struct distance
{
    float left, right;
}dd;
dd dis[N];
int cmp(dd a, dd b)
{
    if (a.right < b.right) return 1;
    return 0;
}
int main()
{
    int n, d, xx, yy, vis[N];
    int t = 1;
    while (scanf("%d%d",&n,&d),n)
    {
        int MAX = 0, cnt = 0;
        memset(dis, 0, sizeof(dis));
        for (int i = 0;i < n;i++)
        {
            cin >> xx >> yy;
            if (MAX < yy) MAX = yy;
            if (1.0*d*d - 1.0*yy*yy < 0) continue;
            else
            {   
                float delta;
                delta = (float)sqrt(1.0*d*d - 1.0*yy*yy);
                dis[cnt].left = xx - delta;
                dis[cnt++].right = xx + delta;
            }
        }
        if (d<0 || MAX>d)
        {
            printf("Case %d: -1\n",t++);
            continue;
        }
        sort(dis, dis + cnt, cmp);
        memset(vis, 0, sizeof(vis));
        int ans = 0;
        dd tmp = dis[0];
        for (int i = 1;i <= cnt;i++)
        {
            if (tmp.right < dis[i].left)
            {
                ans++;
                tmp = dis[i];
            }   
        }
        printf("Case %d: %d\n", t++, ans+1);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值