1.算法
本题是一道贪心题,和《算法艺术与信息学竞赛》中的“照亮的山景”题极为相似。
(1)首先我们求出在每个岛屿放雷达以后在x轴上所能覆盖的区间,是在x轴的上的一个线段,即在这一段上放置雷达可以覆盖到该岛。
(2)我们把每个岛对应的线段找出来,只要在这些线段上放置一些雷达,使得所有的线段上都有雷达即可符合题意(注意如果半径为0或者坐标的y轴小于半径的话将无法完成覆盖,输出-1)。
(3)我们将线段根据左端点排序,找出如果一个线段包含另一个线段,则可以忽略外面的那一个线段(道理很简单),将其设为无效。
(4)在剩下的线段中从左往右遍历,对于每个线段,尽量选取该线段的最右边的点作为雷达,如果之前有雷达在该线段上,则跳过该线段。
(5)每次加一个雷达将计数器加一,最后可以得到解。
2.实现
(1)特别注意对于-1情况的判断,注意如果半径为0或者坐标的y轴小于半径的话将无法完成覆盖。
(2)边读边判断的时候要确保改组所有的数据都读完才能输出-1继续下一组的处理。
(3)在判断x轴上线段是否因为包含其他线段而无效时,可以从右往左遍历从而一次遍历完成判断。
(4)在放置雷达时需要从左往右遍历,这里需要设置一个很小的doule值,以方便第一个雷达的选取,这个值要比integer的最小值的两倍还要小一点,故设为-5000000000。
3.代码
Problem: 1328 User: godfrey90
Memory: 368K Time: 79MS
Language: G++ Result: Accepted
#include <cstdio>
#include <cmath>
struct unit {
double h;
double t;
bool able;
};
void work(int id,int m, int n);
bool get_ht(int r,int x,int y,double *ph,double *pt);
int main() {
int m, n;
int id=0;
scanf("%d %d", &m, &n);
while (!((m == 0) && (n == 0))) {
work(id++,m, n);
scanf("%d %d", &m, &n);
}
return 1;
}
void work(int id,int m, int n) {
//init
int x,y;
unit arr[1000];
int p = 0;
bool flag = true;
for (int i = 0; i < m; i++) {
scanf("%d %d", &x, &y);
if(!get_ht(n,x,y,&(arr[i].h),&(arr[i].t)))
flag = false;
arr[p++].able = true;
}
if(!flag){
printf("Case %d: -1\n",id+1);
return;
}
//sort
int len = p;
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (arr[i].h > arr[j].h) {
unit temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//disable the useless one
int tail = arr[len - 1].t;
for (int i = len - 2; i >= 0; i--) {
if (arr[i].t >= tail) {
arr[i].able = false;
} else {
tail = arr[i].t;
}
}
//find the radar
int count = 0;
double last = -5000000000;
for (int i = 0; i < len; i++) {
if ((arr[i].able) && (arr[i].h > last)) {
count++;
last = arr[i].t;
}
}
printf("Case %d: %d\n",id+1,count);
}
bool get_ht(int r,int x,int y,double *ph,double *pt){
if((r<0)||(r*r-y*y<0)) return false;
double dlt = sqrt(r*r-y*y);
*ph = x-dlt;
*pt = x+dlt;
return true;
}
分享到:
相关推荐
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
poj 1440解题报告 poj 1440解题报告 poj 1440解题报告 poj 1440解题报告
poj 3083解题报告poj 3083解题报告poj 3083解题报告poj 3083解题报告
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
poj 3720解题报告poj 3720解题报告poj 3720解题报告poj 3720解题报告
这个“北大poj解题报告”包含了作者在使用POJ平台解题过程中的学习总结和经验分享,旨在帮助软件工程专业的学生提升编程能力和算法理解。 解题报告通常会涵盖以下几个方面: 1. **基础算法讲解**:解题报告中可能...
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
### poj1691解题报告 #### 题目信息 - **题目名称**:Painting A Board - **时间限制**:1S - **内存限制**:1000K - **提交总数**:62 - **通过总数**:35 - **来源**:...
【ACM竞赛与北大POJ解题报告】 在编程竞赛领域,ACM(国际大学生程序设计竞赛,简称ACM/ICPC)是一项极具影响力的比赛,它挑战参赛者的算法设计、问题理解和快速编码能力。北京大学(Peking University)的在线判题...
【标题】"POJ1328-Radar Installation"是一个编程竞赛题目,源自北京大学的在线评测系统POJ(Problem Online Judge)。这个题目要求参赛者解决一个雷达安装的问题,可能涉及到算法设计、空间几何理解以及高效的代码...
【标题】"80道POJ解题报告"所涉及的知识点主要集中在ACM(国际大学生程序设计竞赛)和POJ(编程Online Judge系统)上。POJ是北京大学主办的一个在线编程竞赛平台,广泛用于训练和提升程序员的算法设计与实现能力。80...
【北大ACM_POJ_解题报告】是北京大学ACM在线评测系统POJ的解题资源集合,这个压缩包包含了对POJ平台上的各种类型ACM竞赛题目的详细解答。ACM,全称国际大学生程序设计竞赛(International Collegiate Programming ...
【POJ 1316 解题报告】 本题源自北京大学举办的ACM竞赛,题号为POJ 1316,主要涉及算法设计和数组的应用。题目要求找到10000以内的所有self-number,并输出它们。Self-number是一个特殊的整数序列,它的定义是该数...
《POJ 2392解题报告:高效计算最高堆积高度》 本文将深入解析POJ 2392这个编程题目,该题目要求利用给定的不同高度、耐压性和数量的block,来确定能够堆叠出的最大高度。解决这个问题的关键在于运用排序和动态规划...
这篇解题报告主要介绍了如何解决POJ2828这个编程题目。该题目涉及的数据结构是区间树(Interval Tree),这是一种用于高效处理区间查询和修改的树形数据结构。在这个问题中,我们需要根据输入的元素位置和值,构建一...
ACM Poj Pku 解题报告答案 打包 下载 600多题 史上最全 不是网上乱传的200多题,更不是100多题就挂着10分才能下的题 下了这个 大家也不要浪费分数去下载其它版本的了,基本上都有 共享 一起进步 中国加油 ACMer...
【POJ解题报告大全】是我精心整理的一份编程题解集合,主要涵盖了在Programming Online Judge(POJ)平台上遇到的250道经典题目。POJ是一个著名的在线编程竞赛平台,它为程序员提供了大量的算法练习题目,是提高编程...
【标签】"ACM POJ解题报告"是关键词,表明这些代码和报告是围绕ACM竞赛中的POJ平台进行的,ACM是全球知名的学生编程竞赛,旨在测试参赛者的算法知识、编程技能和团队合作能力。POJ(Problem Set Archive)是北京大学...