Poj-1328 二维化一维 典型贪婪算法
来源:互联网 发布:一个矩阵怎么计算 编辑:程序博客网 时间:2024/06/06 19:15
题意大概是x轴上方是海洋,海洋上分布着一些岛屿(用点坐标表示),你呢想在岸上安装雷达,使得雷达能扫到岛屿(即在雷达的范围内),求安装雷达的最小数量^-^
Poj-1328#include<cstdio>#include<algorithm>#include<cmath>const int INF = 1000000000;using namespace std;struct Interval { //interval是区间的意思 double left, right;};const int max_island = 1000 + 10;Interval the_interval[max_island];int the_num;double the_r;bool cmp(const Interval& a, const Interval& b) { //排序函数 if (a.right == b.right) return a.left >= b.left; return a.right < b.right;}int main() { int the_case = 1; while (scanf("%d%lf", &the_num, &the_r) == 2) { if (the_num == 0 && the_r == 0) break; double point_x, point_y; bool if_out_r = false; for (int i = 0; i < the_num; i++) { scanf("%lf%lf", &point_x, &point_y); if (point_y > the_r) {//如果离海岸太远,超出雷达半径,我劝你还是放弃吧 if_out_r = true; } else { the_interval[i].left = point_x - sqrt(pow(the_r, 2) - pow(point_y, 2)); the_interval[i].right = point_x + sqrt(pow(the_r, 2) - pow(point_y, 2)); } } if (if_out_r) { printf("Case %d: -1\n", the_case++); } else { sort(the_interval, the_interval + the_num, cmp); double most_left = -INF; //double 我写成int找了很久,最大允许的左边区间点 int the_need_radar = 0; for (int i = 0; i < the_num; i++) { if (the_interval[i].left > most_left) { most_left = the_interval[i].right; the_need_radar++; } } printf("Case %d: %d\n", the_case++, the_need_radar); } } return 0;}
总结:
1.防止思路错误——我先前以为是像平移法一样把圆往右移,依次计算,导致我花了很长一段时间来写
2.审题要仔细,特别是那些对变量的描述的词汇,特别注意如数据类型,范围,输出格式······
3.编程时先写主函数,把框架先写好,遇到阻碍,在写细节。
阅读全文
0 0
- Poj-1328 二维化一维 典型贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- 贪婪算法
- mysql 如何定义游标-存储过程
- 二维数组中有关指针总结
- SSM框架搭建流程(本小白个人用)
- Android 自定义漂亮的圆形进度条
- Python+Eclipse+pyDev开发环境搭建
- Poj-1328 二维化一维 典型贪婪算法
- vmware10+centos6(64)搭建FTP服务
- String对象
- Freemarker之封装easyUI的datagrid,旨在生成快捷方便的管理列表(一)
- Gulp新手入门教程
- STM32F107——OTG模块之USB设备之虚拟串口移植(三)
- SQL基本语法知识(mysql)
- Kotlin学习笔记(2):run、apply、let、also、with的用法和区别
- mysql高可用之MHA