POJ1328 Radar Installation
2015-06-11 10:30
218 查看
题目大意:
在一个海上有好多岛屿,想要在海滩上建立雷达给所有岛屿进行通信,雷达通信有范围限制,要求出在给出固定岛屿坐标后至少需要建立多少雷达。
算法思路:
1) 获取岛屿坐标及雷达通信范围后,计算出该岛屿能够与海滩通信的区域范围,
2)计算出每个岛屿的在海滩的通信范围后,对每个节点的通信范围的左左边进行排序。
3)求出公共区域的数量即得到需要建立雷达的数量
特殊情况注意:
不能忽略雷达的通信半径为0的情况(我就是就被这个边界条件坑惨了。。。)
在一个海上有好多岛屿,想要在海滩上建立雷达给所有岛屿进行通信,雷达通信有范围限制,要求出在给出固定岛屿坐标后至少需要建立多少雷达。
算法思路:
1) 获取岛屿坐标及雷达通信范围后,计算出该岛屿能够与海滩通信的区域范围,
2)计算出每个岛屿的在海滩的通信范围后,对每个节点的通信范围的左左边进行排序。
3)求出公共区域的数量即得到需要建立雷达的数量
特殊情况注意:
不能忽略雷达的通信半径为0的情况(我就是就被这个边界条件坑惨了。。。)
// Radar_Installation.cpp : Defines the entry point for the console application. //poj1328 // //#include "stdafx.h" #include <stdio.h> #include <math.h> #define maxNode 1000 struct island { int x; //value of x-axis int y; //value of y-axis double leftValue; double rightValue; }; struct island landArray[maxNode]; //计算改坐标可以在X轴上可以覆盖的范围 void calCenter(int index,int radius){ int x = landArray[index].x; int y = landArray[index].y; double temp = (radius*radius) - (y*y); landArray[index].leftValue = x - sqrt(temp); landArray[index].rightValue = x + sqrt(temp); } //对于所有的坐标按照可以在X轴上覆盖范围的左边点位置进行排序 void restoreArray(int length){ //冒泡排序 struct island temp; for(int i = 0; i< length; i++) { for(int j = 0; j< (length-i-1); j++){ if(landArray[j].leftValue > landArray[j+1].leftValue){ temp = landArray[j]; landArray[j] = landArray[j+1]; landArray[j+1] = temp; } } } } // 求出两个岛屿建立雷达的公共区域 bool caluCommon(int index1, int index2){ double index1_left = landArray[index1].leftValue; double index1_right = landArray[index1].rightValue; double index2_left = landArray[index2].leftValue; double index2_right = landArray[index2].rightValue; if(index1_right < index2_left) return false; //公共区域没有交集直接返回false else if(index1_right == index2_left){ landArray[index2].leftValue = index2_left; landArray[index2].rightValue = index1_right; return true; } else{ if(index2_right > index1_right){ landArray[index2].leftValue = index2_left; landArray[index2].rightValue = index1_right; return true; }else{ landArray[index2].leftValue = index2_left; landArray[index2].rightValue = index2_right; return true; } } } int main() { int radius = 0; int numOfIsland = 0; int numOfRadio = 0; int testCase = 0; bool calNumOfRadio = true; bool noSolution = false; //freopen("input.txt", "r", stdin); //freopen("test.txt", "r", stdin); // setbuf(stdout, NULL); while(calNumOfRadio){ scanf("%d", &numOfIsland); scanf("%d", &radius); if((numOfIsland == 0) && (radius == 0)) // end break; testCase++; for(int i=0; i< numOfIsland; i++){ // 输入岛屿坐标 scanf("%d",&(landArray[i].x)); scanf("%d",&(landArray[i].y)); if(landArray[i].y > radius){ //遇到岛屿的距离大于半径的情况 noSolution = true; //break; //遇到这种情况需要继续完成本次输入,否则会影响下一个测试case的数据源 } if(!noSolution) calCenter(i,radius); } if(noSolution){ //输入无方案情况 printf("Case %d: -1\n",testCase); noSolution = false; numOfRadio = 0; }else{ restoreArray(numOfIsland); // 对每个岛屿可以在海岸的雷达覆盖范围 进行排序 for(int i = 0;i< numOfIsland; i++){ while((i+1 < numOfIsland) && caluCommon(i,(i+1))){ //计算公共区域 i++; continue; } numOfRadio++; //公共区域无交集 雷达加1 } printf("Case %d: %d\n",testCase,numOfRadio); numOfRadio = 0; } } return 0; }
相关文章推荐
- Android 从入门到精通 第6章 Android应用的核心 Intent
- MySQL开发规范
- CSS3.0的常用新特性
- Linux rpm安装MySQL
- NO 1 ios开发前准备
- 架构的分类
- Action的配置
- Linux apt-get命令
- SQL注入原理讲解,很不错!
- JQuery节点元素属性操作方法
- 欢迎使用CSDN-markdown编辑器
- xcode6+ios8最新真机调试教程
- VBA选中离散的单元格
- Ant android各渠道批量打包混淆
- UNICODE,GBK,UTF-8区别
- 封装WebAPI客户端,附赠Nuget打包上传VS拓展工具
- windows下,firedac访问sqlite的程序
- PlatformDB数据库里几个重要的表
- 透过doublewrite计数来预估系统写入压力
- 怎么书写高质量jQuery代码【收藏】