Language:
Default
Radar Installation
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 42461   Accepted: 9409

Description

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
 #include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<stack>
#include<math.h>
using namespace std; struct node
{
double start;
double end;
}coor[];//记录每个区间的端点
int cmp(const struct node a,const struct node b)
{
return a.start < b.start;
}
int t,r;
stack <node> st;//用栈存每个区间, int cal(int ans)
{
while(!st.empty())
st.pop();
for(int i = t-; i >= ; i--)
st.push(coor[i]);
while(st.size() >= )//当栈中至少存在两个区间时
{
struct node tmp1 = st.top();
st.pop();
struct node tmp2 = st.top();
if(tmp1.end >= tmp2.start)//当取出的两个区间有公共部分时
{
st.pop();//tmp2出栈
struct node tmp;
tmp.start = max(tmp1.start, tmp2.start);//注意取公共部分时,起始点取较大者
tmp.end = min(tmp1.end, tmp2.end);//终点取较小者
st.push(tmp);//将公共部分入栈
ans--;//每两个区间交一次,雷达个数减一次
}
}
return ans;
}
int main()
{ int cor_x[],cor_y[];
double add;
int cnt = ;
while(~scanf("%d %d",&t,&r))
{
int ok = ;//判断小岛的坐标是否合法,
if(t == && r == ) break;
for(int i = ; i < t; i++)
{
scanf("%d %d",&cor_x[i],&cor_y[i]);
if(cor_y[i] > r)//若小岛纵坐标大于半径则不合法
ok = ;
}
if(ok == )
{
printf("Case %d: -1\n", cnt++);
continue;
}
for(int i = ; i < t; i++)
{
//以每个小岛为圆心,r为半径画圆,coor[]存该圆与x轴相交的区间
add = sqrt(r*r-cor_y[i]*cor_y[i]);
coor[i].start = cor_x[i] - add;
coor[i].end = cor_x[i] + add;
}
sort(coor,coor+t,cmp);//对这些区间按起始点从小到大排序
int ans = t;
ans = cal(ans);
printf("Case %d: %d\n",cnt++,ans);
}
return ;
}

Radar Installation 贪心的更多相关文章

  1. POJ 1328 Radar Installation 贪心 A

    POJ 1328 Radar Installation https://vjudge.net/problem/POJ-1328 题目: Assume the coasting is an infini ...

  2. Radar Installation(贪心)

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 56826   Accepted: 12 ...

  3. Radar Installation(贪心,可以转化为今年暑假不ac类型)

    Radar Installation Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) ...

  4. poj 1328 Radar Installation(贪心+快排)

    Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea i ...

  5. POJ - 1328 Radar Installation(贪心区间选点+小学平面几何)

    Input The input consists of several test cases. The first line of each case contains two integers n ...

  6. POJ 1328 Radar Installation 贪心算法

    Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea i ...

  7. POJ1328 Radar Installation(贪心)

    题目链接. 题意: 给定一坐标系,要求将所有 x轴 上面的所有点,用圆心在 x轴, 半径为 d 的圆盖住.求最少使用圆的数量. 分析: 贪心. 首先把所有点 x 坐标排序, 对于每一个点,求出能够满足 ...

  8. poj1328 Radar Installation —— 贪心

    题目链接:http://poj.org/problem?id=1328 题解:区间选点类的题目,求用最少的点以使得每个范围都有点存在.以每个点为圆心,r0为半径,作圆.在x轴上的弦即为雷达可放置的范围 ...

  9. POJ 1328 Radar Installation 贪心题解

    本题是贪心法题解.只是须要自己观察出规律.这就不easy了,非常easy出错. 一般网上做法是找区间的方法. 这里给出一个独特的方法: 1 依照x轴大小排序 2 从最左边的点循环.首先找到最小x轴的圆 ...

随机推荐

  1. 基于MyBatis的数据库切分框架,可实现数据的水平切分和垂直切分。 http://www.makersoft.org

    https://github.com/makersoft/mybatis-shards MyBatis-Shards 专业的MyBatis数据库切分框架 MyBatis Shards简介 MyBati ...

  2. C++ 让 Win32 Console Application 程序后台运行

    方法一:(无闪现) 添加   #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRT ...

  3. Bigcommerce:intershop编程经验总结

    1.修改或者添加网页Title,Keywords,Decoration的代码: $full_url = $_SERVER['REQUEST_URI'];  //获取请求的url $letter = s ...

  4. Reso | liunx下longeneQQ和搜狗拼音

    sogoupinyin_2.0.0.0078_amd64.deb:   http://pan.baidu.com/s/1eSDLvEU WineQQ7.8-20151109-Longene .deb: ...

  5. python手机号码运营商归属测试

    #手机号码测试: def number_test(): while True: number = input('Please enter your phone number:') CN_mobile ...

  6. 转载:C# 中的委托

    原文地址  http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 感谢博主分享! 引言 委托和 ...

  7. Unicode 与多字节编码

    int _tmain(int argc, _TCHAR* argv[]) { //定义LPWSTR 类型的宽字符串 LPWSTR szUnicode = L"This is a Unicod ...

  8. 织梦(dedecms)如何清空全部文章和删除后新增文章id号归1的方法

    很多朋友在使用织梦程序做网站的过程中,难免需要添加一些测试文章用于测试网站功能模板等,还有些人朋友网站改版需要变更内容的时候,面对着众多的老文章后总是一筹莫展! 由于织梦后台并不自带一键删除整站文章的 ...

  9. HTML5音乐播放器

    //HTML5部分 <a href="javascript:void(0);" onclick="getCurrentTime('firefox');"& ...

  10. 学习JAVA第一部分总结

    把自己这几天的学习情况记录下来. 第一章,认识JAVA,了解JAVA的运行机制,虚拟机. 第二章,了解java的注释,标识符,关键字.. 第三章,基本的数据类型,byte short int long ...