poj1328贪心中的区间问题

题意:给定海岛个数、雷达半径以及各海岛坐标,求能覆盖所有海岛的最小雷达数。

思路:先对每个海岛求一个区间:即能覆盖它的所有雷达的圆心所构成的区间。然后对区间排序,定义一个最右点over,依次延伸over,如果over不在某个区间内,那么消耗一颗雷达,over更新为该区间的最右端,否则end更新为起点在over内的所有区间的最小右端点。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
const int maxn=1010;
typedef struct P
{
    double start,over;
}P;
P point[maxn];
bool cmp(P a,P b)
{
    return a.start<b.start;
}
int main()
{
    int n;
    double r;
    int cas=0;
    while(cin>>n>>r)
    {
        if(n==0&&r==0) break;
        int res=0;
        for(int i=0;i<n;i++)
        {
            double x,y;
            cin>>x>>y;
            if(res==-1) continue;
            if(y>r){
                res=-1;
                continue;
            }
            double tt=sqrt(r*r-y*y);
            point[i].start=x-tt;
            point[i].over=x+tt;
        }
        if(res==-1)
        {
            cout << "Case " << ++cas<< ": " << res << endl;
            continue;
        }
        sort(point,point+n,cmp);
        double mi=-0x3ffff;
        for(int i=0;i<n;i++)
        {
            if(mi<point[i].start){
                res++;
                mi=point[i].over;
            }
            else if(mi>point[i].over){
                mi=point[i].over;
            }
        }
        cout << "Case " << ++cas<< ": " << res << endl;
    }
    return 0;
}

我的代码

时间: 2024-10-02 01:14:02

poj1328贪心中的区间问题的相关文章

nyoj 12 喷水装置(二)【贪心】+【区间完全覆盖覆盖】

题意:... 这道题就是区间问题三种中的区间完全覆盖问题,不懂的可以看我上一篇也是区间完全覆盖. 直接上代码: #include <stdio.h> #include <math.h> #include <algorithm> using std::sort; struct node{ double le, ri; }s[1005]; int cmp(node a, node b) { return a.le < b.le; } int main() { int

uva 10020- Minimal coverage (贪心思想 简单区间覆盖)

题目大意:给出一个范围M,然后给出若干的区间,以0 0 终止, 要求用最少的区间将0 ~M 覆盖,输出最少个数以及方案. 解题思路:典型的区间覆盖问题,算法竞赛入门经典P154上有讲. /*author: charkj_z */ /*time: 0.108s */ /*rank: 674 */ /*为什么不把没用的地方去掉? 因为去掉了我觉得不像我能写出来的*/ /*Ac code : */ #include<stdio.h> #include<string.h> #include

JS二分法查找数值在数值中的区间

需求:求一个数字类型,在一个数组中的区间: 1 $(function(){ 2 //二分法计算最近的数组下标 3 Array.prototype.binarySearch = function(obj){ 4 //var value = 0; 5 var left = 0; 6 var right = this.length; 7 while(left <= right){ 8 var center = Math.floor((left+right)/2); 9 if(obj<this[cen

三类基于贪心思想的区间覆盖问题

一.区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖. 样例:一个长度为8的区间,可选的线段有[2,6],[1,4],[3,6],[3,7],[6,8],[2,4],[3,5]. 求解过程: 1.将每一条线段按左端点递增顺序排列,如果左端点相同,按右端点递增顺序排列,排完序后为[1,4],[2,4],[2,6],[3,5],[3,6],[3,7],[6,8]: 2.设置一个变量表示已覆盖到的区间右端点,

UVALive 6911 Double Swords (Set,贪心,求区间交集)

首先左边的是必须要选的,然后右边的需要注意,有些区间是可以舍掉的.1.区间里有两个不同的A. 2.区间里有一个A,而且这个A不是这个区间对应的A. 这个题我一开始错在了第2个判定条件上,我定义的id记录的是最后一个出现位置,不能进行判断,所以干脆在结构体里记录了他对应的A值. 舍掉后留下的区间,可以按照区间左边界排序,然后求交集即可. 总体来说,贪心的思想还是不难的,就是有一些细节需要注意. 代码如下: #include<iostream> #include<cstdio> #in

uva 10020 Minimal coverage 【贪心】+【区间完全覆盖】

Minimal coverage The Problem Given several segments of line (int the X axis) with coordinates [Li,Ri]. You are to choose the minimal amount of them, such they would completely cover the segment [0,M]. The Input The first line is the number of test ca

POJ - 2376 Cleaning Shifts 贪心(最小区间覆盖)

Cleaning Shifts Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some cleaning chores around the barn. He always wants to have one cow working on cleaning things up and has divided the day into T shifts (1 <= T <= 1,000,000

C++中存储区间

在C++中,内存分为5个区,分别是堆.栈.自由存储区,全局/静态存储区.常量存储区. 栈:由编译器在需要的时候分配,不需要时自动起初的存储区.连绵的变量为局部变量,函数参数等. 堆:由malloc分配的空间,申请和释放都需要程序员手动进行,释放由free进行释放. 自由存储区:由new分配的内存块,和堆类似,用delete来进行释放. 全局/静态存储区:全局变量和静态变量存放的区间.内存在程序编译的时候已经分配好,这块内存在整个程序运行期间都在 常量存储区:里面存放常量 void f(){ in

poj1328 贪心

http://http://poj.org/problem?id=1328 神TM贪心. 不懂请自行搜博客. AC代码: #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; struct Node { double l; double r; } node[2010],temp; int cmp(Node x,Node y) {