uva 10382(几何+贪心)

感觉能做出来,场上就是没做出来,本来想一个循环跑完的,结果失败了,看了题解都是跑了两个循环,感觉以后只要卡一下时间就会超时,但还是想不到解决方法

付:精度控制大佬博客http://blog.csdn.net/entalent/article/details/47620341

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=10000+10;
double judge(double c,double a)
{
  double mmp=c*c-a*a;
   return sqrt(mmp);
}
struct note
{
    double x,y;
    bool operator <(const note &p)
    {
        return x<p.x||x==p.x&&y<p.y;
    }
}aa[maxn];
int n;
double l,w;
int main()
{
    while(~scanf("%d%lf%lf",&n,&l,&w))
    {  memset(aa,0,sizeof(aa));
        double c,r;
         int cnt=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%lf%lf",&c,&r);
            if(w<r+r)
            {
                cnt++;
                double ll,rr;
               double mmp=judge(r,w/2.0);
                ll=c-mmp;
                rr=c+mmp;
                aa[cnt].x=ll;
                aa[cnt].y=rr;
            }
        }
        sort(aa+1,aa+1+cnt);
        if(cnt==0||aa[1].x>0) printf("-1\n");
        else
        {
            int ans=0;
            double r=0,rr=0;
              while(r<l)
              {     rr=r;
                   for(int i=1;i<=cnt;i++)
                   {
                      if(aa[i].x<=r&&aa[i].y>rr)
                        rr=aa[i].y;
                   }
                   if(rr==r)
                   {
                       ans=-1;
                       break;
                   }
                   ans++;
                   r=rr;
              }
             printf("%d\n",ans);
        }

    }
    return 0;
}

 

posted on 2017-08-23 15:07  发牌员  阅读(103)  评论(0)    收藏  举报

导航