double qiuzhi(int id)
{double t1=cc[id].rid*cc[id].rid;double t2=w*w/4;double t3=t1-t2;double t4=sqrt(t3);return t4;
}void to_qujian()
{for(int i=0; i<t; i++){double zhi=qiuzhi(i);qq[i].a=cc[i].pos-zhi;qq[i].b=cc[i].pos+zhi;}
}

典型的贪心区间覆盖问题,刘汝佳书上有讲,只有思路没有代码~他总是这么令人蛋疼。。

对本题来说,关键的一点在于由具体问题向“区间”的抽象~!用圆与矩形边的交点作为区间的左右端点!

用了两种方法,按书上的方法,采取多次截取合适区间的方法做了一遍,代码比较清晰实现出来了,但是超时。

原因已经分析清楚,本以为是0(n)的复杂度,但是忽略了排序的n log(n)的复杂度,每次循环都排序,10000的数据量超时是意料之中的事情。

#include<cstdio>//这是超时的代码~看清楚了~~
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn=10000+10;
int n,t;
double l,w;
int flag1,flag2;struct circle
{double pos;double rid;
} cc[maxn];
struct qujian
{double a;double b;
} qq[maxn];
void input(int n,double l,double w)
{t=0;int temp=n;for(int i=0; i<temp; i++){double a1,b1;scanf("%lf%lf",&a1,&b1);if(b1<=w/2){n--;continue;}else{cc[t].pos=a1;cc[t++].rid=b1;}}
}bool cut_qujian(double left,double right)
{flag1=0;flag2=0;for(int i=0; i<t; i++){if(qq[i].a<=left){flag1=1;qq[i].a=left;}if(qq[i].b>=right-0.0000000001){flag2=1;qq[i].b=right;}}if(flag1==1&&flag2==1)return true;elsereturn false;
}
double qiuzhi(int id)
{double t1=cc[id].rid*cc[id].rid;double t2=w*w/4;double t3=t1-t2;double t4=sqrt(t3);return t4;
}void to_qujian()
{for(int i=0; i<t; i++){double zhi=qiuzhi(i);qq[i].a=cc[i].pos-zhi;qq[i].b=cc[i].pos+zhi;}
}int cmp(qujian a,qujian b)
{if(a.a!=b.a) return a.a<b.a;else return a.b>b.b;
}int main()
{while(scanf("%d%lf%lf",&n,&l,&w)!=EOF){input(n,l,w);to_qujian();double left=0,right=l;int ans=-1;int cnt=0;while(cut_qujian(left,right)){cnt++;sort(qq,qq+t,cmp);left=qq[0].b;if(left>=right){ans=1;break;}}if(ans==-1){printf("-1\n");}elseprintf("%d\n",cnt);}return 0;
}

然后思路肯定是不能换,就换实现的方式好了~

用了下面这种看似0(n^2),但实际上复杂度为0(n)的方法,学长给的,觉得很好。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn=10000+10;
int n,t;
double l,w;
int flag1,flag2;struct circle
{double pos;double rid;
} cc[maxn];
struct qujian
{double a;double b;
} qq[maxn];
void input(int n,double l,double w)
{t=0;int temp=n;for(int i=0; i<temp; i++){double a1,b1;scanf("%lf%lf",&a1,&b1);if(b1<=w/2){n--;continue;}else{cc[t].pos=a1;cc[t++].rid=b1;}}
}
double qiuzhi(int id)
{double t1=cc[id].rid*cc[id].rid;double t2=w*w/4;double t3=t1-t2;double t4=sqrt(t3);return t4;
}void to_qujian()
{for(int i=0; i<t; i++){double zhi=qiuzhi(i);qq[i].a=cc[i].pos-zhi;qq[i].b=cc[i].pos+zhi;}
}int cmp(qujian a,qujian b)
{return a.a<b.a;
}int solve()
{int cnt=0;double right=0;for(int i=0; i<t; i++){double nowr=right;for(; qq[i].a<=right; i++){if(qq[i].b>nowr)nowr=qq[i].b;}if(nowr==right) return -1;right=nowr;cnt++;i--;}if(right<l) return -1;return cnt;
}
int main()
{while(scanf("%d%lf%lf",&n,&l,&w)!=EOF){input(n,l,w);to_qujian();int ans;sort(qq,qq+t,cmp);ans=solve();if(ans==-1){printf("-1\n");}elseprintf("%d\n",ans);}return 0;
}

好久都没能有像做这道题目的感受了,感觉很好。

10382 - Watering Grass(贪心 区间覆盖问题)洒水面覆盖相关推荐

  1. UVa 10382 - Watering Grass

    链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&pa ...

  2. UVa10382 - Watering Grass(贪心算法)

    问题:给出一个长为l,宽为w的绿化带,n个喷水装置及其对就位置x和影响半径r.问最少需要多少个喷水装置能全覆盖此绿化带 思路:首先要计算喷水装置可以覆盖的区间,如果喷水装置的影响半径小于等于w/2,是 ...

  3. UVA10382 - Watering Grass 题解

    原题链接 Online Judge: 10382 - Watering Grass Virtual Judge: Watering Grass - UVA 10382 洛谷:UVA10382 Wate ...

  4. 高效算法——E - 贪心-- 区间覆盖

    E - 贪心-- 区间覆盖 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/E 解题思路: 贪心思想, ...

  5. 贪心 区间覆盖最小值

    贪心 区间覆盖最小值 POJ 2376 大概题意: 从1到T区间内,必须保证每个点都有牛在工作,给出每头牛的工作时间,求需用到的最小的牛的数量,无解输出-1 一开始以为组合[1,4] [5,T]不算覆 ...

  6. Watering Grass——UVA10382

    题目 n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each s ...

  7. [AcWing] 905. 区间选点(C++实现)贪心---区间问题例题

    [AcWing] 905. 区间选点(C++实现)贪心---区间问题例题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. ...

  8. 详述白盒测试的逻辑覆盖法的判定覆盖及其优缺点

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 详述白盒测试的逻辑 ...

  9. 覆盖问题:最大覆盖问题(Maximum Covering Location Problem,MCLP)和集覆盖问题(Location Set Covering Problem,LSCP)...

    集覆盖问题研究满足覆盖所有需求点顾客的前提下,服务站总的建站个数或建 设费用最小的问题.集覆盖问题最早是由 Roth和 Toregas等提出的,用于解决消防中心和救护车等的应急服务设施的选址问题,他们 ...

最新文章

  1. nginx 转发慢_为啥 Nginx 能轻松淦到几万并发?
  2. SVM_GUI_3.1[mcode]{by faruto}的安装及使用
  3. mybatis自我总结
  4. window下部署ELK(6.2.2系列)
  5. CTL_CODE说明
  6. EJB3.0学习笔记--SOAP-AXIS--深入Soap引擎
  7. 谷歌AI的七个“不正经”玩法,个个能玩一整天
  8. pn532跳坑小指南
  9. 【Luogu3478】【POI2008】STA-Station(动态规划)
  10. shell 强制覆盖文件夹_如何强制robocopy覆盖文件
  11. 最全的测试计划模板参考
  12. FPGA驱动ESP8266 WiFi模块
  13. 名义利率、实际利率、名义贴现率
  14. 深入了解机器学习(Descending into ML):线性回归
  15. ENVOY的首个 NFT 发行版“Decentraboard”数小时内售罄
  16. 无法解析该名称 outlook必须处于联机,控制面板删除账户
  17. python 将多个文件夹合成一个文件夹
  18. 微信小程序flex布局怎么实现上中下3行铺满整个窗口。
  19. 安全帽识别系统的应用鹰眸视频分析
  20. Oracle锁3:DDL锁

热门文章

  1. uni-app底部安全区高度(padding-bottom、bottom)
  2. 申请软件著作权登记没有源代码怎么办?如果有源代码怎么快速下证?
  3. 软件平台项目设计开发流程
  4. python程序开发第四课:数据结构(2)元组(3)字符串
  5. 机器人快跑!伯克利和CMU联合开发两足机器人,两条细腿,一马平川
  6. 红黑树检索/插入/删除
  7. atoi,atol,strtod,strtol,strtoul实现类型转换
  8. 河南理工大学2018暑假集训第二次积分赛 2018/07/29
  9. 视图实现圆角效果的三种方法及比较
  10. [置顶] 常用小片段指令集锦