UVA 10382
来源:互联网 发布:好吉他淘宝 编辑:程序博客网 时间:2024/05/21 18:40
//为什么要按左边界进行排序,贪心 #include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;struct Node{ double l,r;};Node water[10005];int n,l,w;int cmp(Node a,Node b){ return a.l<b.l;}int main(){ double p,r; double len; while(scanf("%d%d%d",&n,&l,&w)!=EOF){ int num=0; for(int i=0;i<n;i++){ scanf("%lf%lf",&p,&r); if(r>w*1.0/2){ len=sqrt(r*r*1.0-w*w*1.0/4); water[num].l=p-len; water[num++].r=p+len; } } sort(water,water+num,cmp); int res=0; double left=0,right=0; int i; //用来标记 bool flag=false; for(i=0;i<num;i++){ int j=i; //每次寻找小于左边界的,且右边界最大的值 while(j<num&&water[j].l<=left){ if(right<water[j].r) right=water[j].r; j++; } if(j==i) break; ++res; left=right; i=j-1; if(left>=l){ flag=true; break; } } if(!flag) printf("-1\n"); else printf("%d\n",res); } return 0;}