贪心算法之——喷水装置二(nyoj12)
题目描述:
喷水装置(二)
- 描述
-
有一块草坪,横向长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刷-贪心算法篇(二) [452. 用最少数量的箭引爆气球](https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-b ...
- 贪心算法之——喷水装置一(nyoj6)
描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1& ...
- 活动安排问题的 动态规划和贪心算法
这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...
- 从 活动选择问题 看动态规划和贪心算法的区别与联系
这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...
- 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题...
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...
- 通俗易懂:贪心算法(二):区间问题 (力扣435无重叠区间)
看完本文,可以顺便解决leetcode以下题目: 435.无重叠区间(中等) 一.通俗易懂的 贪心算法 |思想 (重复一次~~~) 贪心算法就是采用贪心的策略,保证每一次的操作都是局部最优的,从而使得 ...
- 八十二、Python | Leetcode贪心算法系列
@Author:Runsen @Date:2020/7/5 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...
- 08_Python算法+数据结构笔记-二叉搜索树查询/删除-AVL树旋转/插入/应用-贪心算法
b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili #71 二叉搜索树:查询 import randomclass BiTreeNode:def __ ...
- 算法设计与分析 实验二 贪心算法
实验2.<贪心算法实验> 一.实验目的 了解贪心算法思想 掌握贪心法典型问题,如背包问题.作业调度问题等. 二.实验内容 编写一个简单的程序,实现单源最短路径问题. 编写一段程序,实现找零 ...
最新文章
- mysql下载解压安装_mysql zip 解压安装
- 从封装函数到实现简易版自用jQuery (一)
- ASP.NET 大文件下载的实现思路及代码
- 抓包概念大比较:数据报、数据包、分组
- python中plot柱状图-Matplotlib中柱状图bar使用
- 【项目实战课】基于Pytorch的SRGAN图像超分辨实战
- 安装erlang没有bin文件夹_Centos7安装RabbitMQ(Centos6 此方案同样可行)
- python legb_Python变量作用域LEGB用法解析
- 排序算法之快速排序详解
- C# 彻底搞懂async/await
- Rest_Framework之频率组件部分
- iOS设计模式 - 桥接
- Docker安装Oracle教程
- 离破产仅一步之遥的A站,还能挺过去吗?
- 数据挖掘的步骤有哪些
- hdfs上的csv文件导入mysql表_HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)...
- Sourcetree 看不了文件内容 Diff was suppressed because of file size or pattern
- Syncfusion的新JavaScript条形码生成器控件
- html+css常用代码(前端必备)
- java 颜色平滑渐变算法_颜色渐变算法
热门文章
- 为了找到你,CTO 和你唠唠研发都做啥?
- “埋点”到底要不要?
- 如何定位“Operating system error 32(failed to retrieve text for this error. Reason: 15105)”错误中被占用的文件...
- JS对象变量、闭包的一些问题
- Java基础-面向对象第二特征之继承(Inheritance)
- 解决ntp的错误 no server suitable for synchronization found
- 手写一个jsonp实现
- 企业管理 为什么老板再难,也不会放弃?而员工做得不顺,就想逃走?
- 经典vim插件功能说明、安装方法和使用方法介绍(已更新)
- HP 3055 恢复出厂