喷水装置(二)
来源:互联网 发布:ubuntu完全卸载wine 编辑:程序博客网 时间:2024/04/30 11:23
- 输入
- 第一行输入一个正整数N表示共有n次测试数据。
每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。
随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。 - 输出
- 每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。
如果不存在一种能够把整个草坪湿润的方案,请输出0。 - 样例输入
22 8 61 14 52 10 64 56 5
- 样例输出
12
#include"stdio.h"
#include"stdlib.h"#include"math.h"
#include<algorithm>
using namespace std;
#define N 10010
struct Node
{
double begin;
double end;
}node[N];
bool cmp(Node a,Node b)//按照左交点的大小进行排序{
if(a.begin<b.begin) return true;
return false;
}
int main()
{
int i,n,k,
int ncase;
int w,h;
int x;
int ans=0;
double R,t,r,max,p;
int flag=1;
scanf("%d",&ncase);
while(ncase--){
scanf("%d%d%d",&n,&w,&h);
R= h/(2*1.0) ;
t= h*h/(4*1.0);
k=0;//////////
//预处理一下,就是将问题转换为区间问题
for(i=0;i<n;i++)
{
scanf("%d%lf",&x,&r);
if(r>R)
{
r=sqrt(r*r-t);
node[k].begin=x-r;
if(node[k].begin<0) node[k].begin=0;////////
node[k].end=x+r;
if(node[k].end>w) node[k].end=w;//////////
k++;//////////////k个符合条件的
}
else//(半径<R)
{
continue;
}
}
sort(node,node+n,cmp);
ans=0;
p=0;
//i=0;
while(p<w)//当铺的路还没有铺满
{
max=0;
//寻找符合条件,并且最右端的值最大的那个
for(i=0;node[i].begin<=p&&i<k;i++)/////k;
{
if(node[i].end-p>=max)
max=node[i].end-p;
}
if(!max)
{
flag=0;
break;
}
p+=max;
ans++;
}
if(!flag)
{
printf("0\n");
}
else
{
printf("%d\n",ans);
}
}
return 0;
}
0 0
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置-(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 喷水装置(二)
- 给C++程序员的公告
- Linux当中read的使用
- 小递归
- 关于C99标准在keilMDK中实验引发的,ADR指令认识,ARM寄存器之R12,及C89,C90,C95,C99标准的区别
- 2014编程之美初赛第一场(java版)
- 喷水装置(二)
- 论“纸老虎”
- [ACM] hdu 2352 Stars (树状数组)
- 详解Linux2.6内核中基于platform机制的驱动模型
- Android OTA增量包update.zip的生成
- IOS - 运行时 (多态)
- UVa 253 立方体着色
- 关于YII动态切换主题的问题
- linux的权限问题