1. 程式人生 > 實用技巧 >POJ 1328 Radar Installation 貪心 區間選點

POJ 1328 Radar Installation 貪心 區間選點

區間選點,貪心

計算區間後找到最少的點使得每個區間內都有點

//很多要寫double的地方寫了int
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

int n, d;
int cnt = 1;
typedef struct
{
    double s, e; //以島嶼為中心的區間
}pos;
pos p[1000];


bool cmp(pos a, pos b)   //以右端點排序
{
    if(a.e == b.e) return a.s < b.s;
    else return a.e < b.e;
}

int solve()
{
    int ans = 1;
    int i = 1;
    int index = 0; //雷達在index區間的右端點
    while(i < n)    //下一個區間的左端點不在裡面 ans++
    {
        if(p[index].e < p[i].s) 
        {
            ans++;
            index = i;
        }
        i++;
    }
    return ans;
}

int main()
{
    while(~scanf("%d %d", &n, &d))
    {
        if(n == 0) break;
        bool flag = true;
        int x, y;
        for(int i = 0; i < n; i++)
        {
            scanf("%d %d", &x, &y);
            double dis = sqrt(double(d*d-y*y));
            if(y > d) flag = false;
            p[i].s = x-dis;
            p[i].e = x+dis;
        }
        if(flag)
        {
            sort(p, p+n, cmp);
            printf("Case %d: ", cnt++);
            printf("%d\n", solve());
        }
        else printf("Case %d: -1\n", cnt++);  //一直沒發現這邊錯了,原本直接輸出的-1
    }
    system("pause");
    return 0;
}