zoukankan      html  css  js  c++  java
  • poj 1328 贪心

    /*
    贪心....
    处理处每个点按照最大距离在x轴上的映射
    然后我们就有了一些线段 目的是选取尽量少的点 使得每个线段内都有点出现
    我们按照左端点排序 然后逐一处理 假设第一个雷达安在第一个线段的右端点
    若下一条与之无交点 则再按一个雷达 若完全覆盖 贪心的 我们把雷达移动到下一条的右端点
    这样这个雷达就又多覆盖了一个岛 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define maxn 1010
    using namespace std;
    int n,ans,cas;
    double d,x,y;
    struct node
    {
        double l,r;
    }p[maxn];
    int cmp(const node &a,const node &b)
    {
        if(a.l==b.l)return a.r<b.r;
        return a.l<b.l;
    }
    int main()
    {
        while(1)
          {
              ans=1;int falg=0;
            scanf("%d%lf",&n,&d);
            if(n==0&&d==0)break;
            for(int i=1;i<=n;i++)
              {
                  scanf("%lf%lf",&x,&y);
                  if(y>d)falg=1;
                 p[i].l=x-sqrt(d*d-y*y);
                p[i].r=x+sqrt(d*d-y*y);
              }
            if(falg){printf("Case %d: -1
    ",++cas);continue;
            sort(p+1,p+1+n,cmp);
            double t=p[1].r;
             for(int i=2;i<=n;i++)
              {
                  if(p[i].l>t)
                    {
                        ans++;t=p[i].r;continue;
                   }
                if(p[i].r<=t)
                  {
                      t=p[i].r;continue;
                  }
                if(p[i].r>t)continue;
              }
            printf("Case %d: %d
    ",++cas,ans);
          }
        return 0;
    }
  • 相关阅读:
    数组与方法
    数据类型
    认识Java(2)
    认识Java(1)
    面试题集锦
    00-python语言介绍
    06-python-生成器、循环器
    00-python-内置函数笔记
    04-python-闭包
    03-python-装饰器
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5648698.html
Copyright © 2011-2022 走看看