杂题专项:UVa 10382
来源:互联网 发布:c#和c语言的区别 编辑:程序博客网 时间:2024/05/10 23:24
一开始以为是一道简单的区间覆盖贪心,区间是离散化的。后来才发现区间是连续的,每个sprinkler覆盖的区间为[p-sqrt(r*r-w*w/4),p+sqrt(r*r+w*w/4)]。
贪心策略在lrj的入门经典里有非常详细的叙述。这里简单说一下,就是已经覆盖的区间全部排除不考虑,然后在剩下的区间中选择能覆盖的最远的那个即可。这里我用的是优先队列的方式实现的。
#include <iostream>#include <fstream>#include <cstring>#include <cstdio>#include <queue>#include <cmath>using namespace std;const double eps=1e-10;int dcmp(double x){ if(fabs(x)<eps) return 0; else return x<0?-1:1;}int n,l,w;struct interval{ double l,r; interval(double l=0,double r=0):l(l),r(r){} bool operator<(const interval& t) const { return dcmp(l-t.l)>0||(dcmp(l-t.l)==0&&dcmp(r-t.r)<0); }};priority_queue<interval> q;int main(){ freopen("in.txt","r",stdin); while(cin>>n>>l>>w) { while(!q.empty()) q.pop(); int p,r; for(int i=0;i<n;i++) { cin>>p>>r; if(w>2*r) continue; double t=sqrt(1.0*r*r-1.0*w*w/4); q.push(interval(p-t,p+t)); } double cover=0; int ans=0; while(!q.empty()) { if(dcmp(cover-l)>=0) break; double L=q.top().l,R=q.top().r; q.pop(); if(dcmp(R-cover)<=0) continue; else if(dcmp(L-cover)<0) q.push(interval(cover,R)); else if(dcmp(L>cover)>0) break; else { ans++; cover=R; } } if(dcmp(cover-l)>=0) cout<<ans<<endl; else cout<<-1<<endl; } return 0;}
- 杂题专项:UVa 10382
- 杂题专项:UVa 10670
- 杂题专项:UVa 10012
- 杂题专项:UVa 818
- 杂题专项:UVa 11627
- 字符串专项:UVa 12012
- 搜索专项:UVa 10318
- 字符串专项:UVa 10298
- 字符串专项:UVa 11475
- 字符串专项:UVa 11855
- 杂题专项:LA 3602
- 杂题专项:LA 5842
- 数学专项counting:UVa 11038
- 数学专项counting:UVa 10883
- 计算几何专项:UVa 11437
- 计算几何专项:UVa 11646
- 计算几何专项:UVa 11817
- 计算几何专项:UVa 11524
- C++和Java运算符优先级表
- 一个小程序,让你知道Qt一次能支持按下多少个键(一)
- cocos2d-x.2.0 人物动画帧实现
- C语言---排序算法-------直接插入排序(一)
- 最大权闭合图 zoj2930
- 杂题专项:UVa 10382
- 最佳软件开发实践指导
- linux shell数据重定向(输入重定向与输出重定向)详细分析
- HDOJ 1005
- 数学专项counting:LA 5846
- java - JNI - 【 java <-> C++ String 的转换 】
- Ogre:Hardwarebuffer
- Vertex and Index Buffers在OGRE中的应用
- 题目11