ACM 喷水装置(二)
2024-08-31 01:00:45
喷水装置(二)
时间限制: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
区间覆盖问题分成三种情况(“---”表示区间)
第一种情况
a -----------
b --------------
c -----------
此时没有能覆盖b和c之间的区域
第二种情况
a -----------
b ------------
c -------------
此时需要选择a,b,c三个区间
第三种
a -----------
b -------------
c ---------------此时选择a,c两个区间就能覆盖住,不需要选择3个区间
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std; struct Segment{
double first,second;
Segment(double first_ = , double second_ = ):first(first_),second(second_){}
bool operator < (const Segment& a) const{
if(first!=a.first) return first < a.first;
else return second > a.second;
}
}; int main(){
int N;
cin >>N;
for(int icase = ; icase < N; icase ++ ){
int n;
double w,h;
cin >> n >>w >> h;
vector<Segment> segments;
for(int i = ; i < n; ++ i){
double x,r;
cin >> x >>r;
if(*r >= h){
segments.push_back(Segment(x - sqrt(*r*r-h*h)/,x + sqrt(*r*r-h*h)/));
}
}
sort(segments.begin(),segments.end());
int cnt = ;
double left = segments[].first, right = segments[].second, prevRight = ;
for(int i = ; i < segments.size(); ++ i){
if(segments[i].first > right ){ // 第一种情况
cnt = ;
break;
}else if(segments[i].first >= prevRight){ //第二种情况
cnt++;
prevRight = right;
right = segments[i].second;
}else if(segments[i].first < prevRight && segments[i].second > right){ //第三种情况
right = segments[i].second;
}
if(right >= w) break;
}
if(left<= && right >= w) cout<<cnt<<endl;
else cout<<<<endl;
}
}
最新文章
- 写入文件(txt格式)
- python 最佳入门实践
- mybatis+spring的简单介绍学习
- 学习Learn Python The Hard Way 前言中的一段话,可与君共勉
- ubuntu find方法
- Android Cursor类的概念和用法
- mysqladmin在SuSE linux系统中--sleep參数使用不准确问题
- Access to the temp directory is denied. Identity &#39;NT AUTHORITY\NETWORK SERVICE&#39; under which XmlSerializer is running does not have sufficient permiss
- Django框架全面讲解
- 一步一步学MySQL-日志文件
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- SSM-Spring-19:Spring中JdbcTemplate
- python操作随笔
- 最短路径HDU3790(Dijkstra)
- fortran语言调用fortran写的dll
- <;自动化测试方案_2>;第二章、自动化测试是什么?(What)
- 【转】cookie如何共享到各个浏览器
- AI-restful接口写法
- Shell脚本笔记(七)控制Shell脚本
- 【阅读笔记】《C程序员 从校园到职场》第六章 配置文件,makefile 文件 (Part 2)
热门文章
- 谈谈Delphi中的类和对象1---介绍几个概念 &;&; 对象是一个地地道道的指针
- Delphi基础语法的学习笔记和注意事项总结
- 【JAVA多线程问题之死锁】
- 【131031】<;meta http-equiv=...>; 的功能
- BOOL in Object-C
- [译] Extending jQuery Part1 Simple extensions
- SVN-简要说明
- CentOS7安装PHP简易步骤
- 分享Kali Linux 2016.2第45周镜像
- CSS3-html,样式与样式表的创建,选择器