题目描述:

喷水装置(二)

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。

输入
第一行输入一个正整数N表示共有n次测试数据。
每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。
随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。
输出
每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。
如果不存在一种能够把整个草坪湿润的方案,请输出0。
样例输入
2
2 8 6
1 1
4 5
2 10 6
4 5
6 5
样例输出
1
2

分析:

这是贪心中区间覆盖的问题:

数轴上有n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定线段[s,t].(而这一题的变化在于要先对数据进行处理把圆心和半径,转换成区间的[ai,bi])

本题的突破口在与区间包含和排序扫描,把各区间按照a从小到大排序。如果区间1的起点不是<=s,无解(因为其他区间的起点更大,不可能覆盖到s点),否则选择起点在s(或s之前)的右端点b最大的区间。选择此区间[ai,bi]后,新的起点应该设置为s=bi。然后继续向后扫描,直到所有区间扫描完毕,判断选择的最后一个区间的右端点bi是否小于t,小于则无解。

源码:

#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef struct line
{double left, right;
}Line;bool cmp(Line l1,Line l2)
{return l1.left < l2.left;
}
int main()
{int t;scanf("%d", &t);while(t--){Line l[10005]={0};int n, w, h;double x, r;scanf("%d%d%d", &n, &w, &h);for(int i=0; i<n; i++){scanf("%lf%lf", &x, &r);if(2*r>h){double temp = sqrt(r*r-h*h/4.0);l[i].left = x-temp;l[i].right = x+temp;}}sort(l, l+n, cmp);double start=0.0;if(l[0].left>start) puts("0");  //如果区间1的起点不是<=start,无解else{int i=0,max=0,cnt=0;while(1){for(; i<n; i++){if(l[i].left<=start){//选择起点在start(或start之前)的右端点b最大的区间if(l[i].right>l[max].right) max = i;  }else break;}start = l[max].right;if(l[i].left>start) {puts("0"); break;}cnt++;//判断选择的最后一个区间的右端点bi是否小于w,小于则无解。if(i==n && l[max].right<w) {puts("0"); break;}  if(start>=w) {printf("%d\n", cnt); break;}}}} return 0;
}

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=12

贪心算法之——喷水装置二(nyoj12)相关推荐

  1. 代码随想录1刷—贪心算法篇(二)

    代码随想录1刷-贪心算法篇(二) [452. 用最少数量的箭引爆气球](https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-b ...

  2. 贪心算法之——喷水装置一(nyoj6)

    描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1& ...

  3. 活动安排问题的 动态规划和贪心算法

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

  4. 从 活动选择问题 看动态规划和贪心算法的区别与联系

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

  5. 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题...

    1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...

  6. 通俗易懂:贪心算法(二):区间问题 (力扣435无重叠区间)

    看完本文,可以顺便解决leetcode以下题目: 435.无重叠区间(中等) 一.通俗易懂的 贪心算法 |思想 (重复一次~~~) 贪心算法就是采用贪心的策略,保证每一次的操作都是局部最优的,从而使得 ...

  7. 八十二、Python | Leetcode贪心算法系列

    @Author:Runsen @Date:2020/7/5 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  8. 08_Python算法+数据结构笔记-二叉搜索树查询/删除-AVL树旋转/插入/应用-贪心算法

    b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili #71 二叉搜索树:查询 import randomclass BiTreeNode:def __ ...

  9. 算法设计与分析 实验二 贪心算法

    实验2.<贪心算法实验> 一.实验目的 了解贪心算法思想 掌握贪心法典型问题,如背包问题.作业调度问题等. 二.实验内容 编写一个简单的程序,实现单源最短路径问题. 编写一段程序,实现找零 ...

最新文章

  1. mysql下载解压安装_mysql zip 解压安装
  2. 从封装函数到实现简易版自用jQuery (一)
  3. ASP.NET 大文件下载的实现思路及代码
  4. 抓包概念大比较:数据报、数据包、分组
  5. python中plot柱状图-Matplotlib中柱状图bar使用
  6. 【项目实战课】基于Pytorch的SRGAN图像超分辨实战
  7. 安装erlang没有bin文件夹_Centos7安装RabbitMQ(Centos6 此方案同样可行)
  8. python legb_Python变量作用域LEGB用法解析
  9. 排序算法之快速排序详解
  10. C# 彻底搞懂async/await
  11. Rest_Framework之频率组件部分
  12. iOS设计模式 - 桥接
  13. Docker安装Oracle教程
  14. 离破产仅一步之遥的A站,还能挺过去吗?
  15. 数据挖掘的步骤有哪些
  16. hdfs上的csv文件导入mysql表_HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)...
  17. Sourcetree 看不了文件内容 Diff was suppressed because of file size or pattern
  18. Syncfusion的新JavaScript条形码生成器控件
  19. html+css常用代码(前端必备)
  20. java 颜色平滑渐变算法_颜色渐变算法

热门文章

  1. 为了找到你,CTO 和你唠唠研发都做啥?
  2. “埋点”到底要不要?
  3. 如何定位“Operating system error 32(failed to retrieve text for this error. Reason: 15105)”错误中被占用的文件...
  4. JS对象变量、闭包的一些问题
  5. Java基础-面向对象第二特征之继承(Inheritance)
  6. 解决ntp的错误 no server suitable for synchronization found
  7. 手写一个jsonp实现
  8. 企业管理 为什么老板再难,也不会放弃?而员工做得不顺,就想逃走?
  9. 经典vim插件功能说明、安装方法和使用方法介绍(已更新)
  10. HP 3055 恢复出厂