zoukankan      html  css  js  c++  java
  • 贪心算法

    题目描述

    1328:Radar Installation
    总时间限制: 1000ms 内存限制: 65536kB
    描述
    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
    输入
    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
    输出
    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.
    样例输入
    3 2
    1 2
    -3 1
    2 1

    1 2
    0 2

    0 0
    样例输出
    Case 1: 2
    Case 2: 1
    来源
    Beijing 2002

    解题分析

    将每个小岛被雷达覆盖,需要雷达在海岸线的位置范围表示出来,将所有线段按着起点顺序排序,维护一个被当前雷达覆盖的线段集合,加入一条线段时判断是否与集合中所有线段有交集,如果有,可以加入,如果没有,说明这个线段需要用一个新的雷达点覆盖,更新被当前雷达覆盖的线段集合。
    实现的时候可以记录当前集合最小的右端点。

    解题代码

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    //#include <vector>
    using namespace std;
    
    struct line{
        double l, r;
    }s[1005];
    
    bool operator < (const struct line & a, const  struct line & b){
        return a.l < b.l;
    }
    
    int n, d;
    int main(){
        int Case = 0;
        int ans = 0;
        while(scanf("%d%d", &n, &d) != EOF){
            if(n == 0 && d == 0) break;
            Case++;
            ans = 1;
            int i;
            int flag = 1;
            for(i = 0; i < n; i++){
                int x, y;
                scanf("%d%d", &x, &y);
                if(y > d)
                    flag = 0;
                if(flag){
                    double a = sqrt(d*d - y*y);
                    s[i].l = x - a;
                    s[i].r = x + a;
                }
            }
            
            if(!flag) {
                printf("Case %d: %d
    ", Case, -1);
                continue;
            }
            
            sort(s, s + n);
            double minr = s[0].r;
            
            for(int i = 0; i < n; i++){
                if(s[i].l <= minr){
                    minr = s[i].r < minr ? s[i].r : minr;
                }
                else
                {
                    ans++;
                    minr = s[i].r;
                }
            }
            
            printf("Case %d: %d
    ", Case, ans);
            
        }
        return 0;
    }
    
  • 相关阅读:
    flask 基础
    新的项目部署
    linux (01) linux基础
    linux (04) linux安装mysql
    linux (06) redis安装
    linux (09) nginx反向代理,负载均衡
    linux (08) nginx入门详解
    linux (07) redis详解
    linux(05) 编译安装py3
    spring-boot war包部署(二)
  • 原文地址:https://www.cnblogs.com/zhangyue123/p/12774718.html
Copyright © 2011-2022 走看看