喷水装置二 nyoj12

来源:互联网 发布:电脑管家婆软件 编辑:程序博客网 时间:2024/06/09 18:21

来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=12

有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。

输入
第一行输入一个正整数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
样例输出
            1
            2
易知半径为r的喷水装置可以覆盖以2*sqrt(r*r-length*length/4) (r*r-length*length/4>0)为宽,length为长的矩形,但此题加了坐标限制,那么以x为中心的喷水装置就可以覆盖[x-temp,x+temp]的长度 (temp=sqrt(r*r-length*length/4,temp>=0)
如果没有坐标限制,直接贪心,每次取能覆盖最大的,直至全部覆盖,其解即为最优解.
有了坐标限制,那么可以按照这样的策略进行贪心,先对每个喷水装置以左区间的值进行从小到大排序(从左边开始覆盖,进行选择)
贪心过程:
选择的喷水装置左区间必须小于或等于当前已经覆盖的长度,否则这样会有空隙.对喷水装置所能覆盖的右区间进行筛选,选择往右覆盖最大的加入最优解中,如果最大往右覆盖为0且没有完全覆盖,则表明不存在方案.
Ac code:
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct Dist
{
 double left,right;
}w[10002];
int comp(const void *p1,const void *p2)
{
 return        ((*(Dist*)p1).left)>((*(Dist*)p2).left)?1:-1;
}
int main()
{
 int test;
 scanf("%d",&test);
 while(test--)
 {
  memset(w,0,sizeof(w));
  int num,width,length,i,x,ri;
  scanf("%d%d%d",&num,&width,&length);
  for(i=0;i<num;++i)
        {
   scanf("%d%d",&x,&ri);
   double temp=ri*ri-(length*length)/4;
   if(temp>=0) temp=sqrt(temp);
   else temp=0;
   w[i].left=int(x-temp);
   w[i].right=int(x+temp);
  }
  qsort(w,num,sizeof(w[0]),comp);        //左区间排序
  double sum=0,flag=1,Count=0;
  i=0;
  while(sum<width)
  {
   double j=0;
   for(i;w[i].left<=sum&&i<num;i++)
   {
    if(w[i].right-sum>=j)
    j=w[i].right-sum;
   }
   if(j==0)
   { flag=0;break; }
   sum=sum+j;
   Count++;
  }
  if(!flag)
  cout<<0<<endl;
  else
  cout<<Count<<endl;
 }
}

 

 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 种植牙中央螺栓断在牙根里怎么办 欧联杯冠军已经获得欧冠资格怎么办 孩子该上学了学校不收怎么办 帮室友带东西她忘给钱怎么办? 鸿合录播系统不会自动跟踪了怎么办 小米2s锁屏密码忘了怎么办 想用中国驾照去美国开车怎么办? 5座的车坐7个人怎么办 海尔电视机的设置调乱了怎么办 老公弟兄两个有个偏心的婆婆怎么办 农商银行u盾密码忘了怎么办 不熟的表弟表妹向你借钱怎么办 开货车撞到人家房子了怎么办 坐骨被摔跤后好多年没好怎么办 自动挡汽车电子手刹刹车失灵怎么办 买家拍了不包邮的宝贝付款了怎么办 包邮快递买家不要了运费怎么办 舞蹈劈叉练出肌肉劈不下去怎么办 腰间盘突出压迫神经腿疼怎么办盘 绑定了我身份证的微信被盗了怎么办 用身份证办的手机卡不用了怎么办 平安陆金所交易密码忘了怎么办 陆金所密码交易密码忘记怎么办 带介指手指月肿了拿不下来怎么办 老公搞建筑的要长期在外地怎么办 媳妇跟婆婆吵架老公帮婆婆该怎么办 在家里礼佛香炉剩下的香头怎么办 精索曲张最近一打篮球就蛋疼怎么办 都两天了快递还是显示已发货怎么办 中通快递到达一天就是不派送怎么办 顺丰派送员把快递寄错了怎么办 顺丰快递把户籍卡弄丢了怎么办 金立手机不小心设置成英文了怎么办 三星手机不小心设置成英文了怎么办 手游方舟国际版渡渡鸟跟丢了怎么办 一打电话4g变2g怎么办 手机4g突然变2g怎么办 江湖风云录八卦门任务拒绝了怎么办 百度网盘下载时显示违规信息怎么办 在海马助手下载的游戏闪退怎么办 手机版百度云盘不能普通下载怎么办