暑假训练 Radar Installation POJ - 1328 贪心

题目描述:
Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d.

We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.

Figure A Sample Input of Radar Installations

Input
The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases.

The input is terminated by a line containing pair of zeros
Output
For each test case output one line consisting of the test case number followed by the minimal number of radar installations needed. “-1” installation means no solution for that case.
Sample Input
3 2
1 2
-3 1
2 1

1 2
0 2

0 0
Sample Output
Case 1: 2
Case 2: 1

code:

#include<cstdio>
#include<algorithm>
#define maxn 25002
using namespace std;

struct cow
{
    int beginn;
    int endn;
    bool operator <(const cow&a)const
    {
        return beginn < a.beginn;
    }
};

cow time[maxn];
int n, t, n1 = 0, t1 = 1;
void turn(int a, int b)
{
    int i;
    for(i = 1; i < n; i++)
    {
        if(time[i].beginn <= t1 + 1)
        {
            if(time[i].endn > b)
                b = time[i].endn;
        }
        else break;
    }
    if(b > t1)t1 = b;
    n1 = i;
}

int main()
{
    while(~scanf("%d%d", &n, &t))
    {
        int num = 0;
        n1 = 0, t1 = 0;
        for(int i = 0;)
    }
}

小结:
贪心算法的思路是寻找局部最优解,以此来达到整体最优解,但并不一定总能得到最优解,这种找区间的问题算是其中一类可以用贪心算法来计算的问题。同时,贪心算法总和dp进行比较,dp的思路是将一个大的问题化解为一个小的同类问题,有点类似递归的思路,但不同的是它将每一步小问题的结果记录下来,不用重复计算,牺牲空间来得到时间效率。一些dp的问题可以用贪心算法来更快求解。

猜你喜欢

转载自blog.csdn.net/wbl1970353515/article/details/82971758