巢穴

about:blank

P1328

   贪心
   求出每个岛屿被雷达覆盖,雷达位置的最左点和最右点
   按左值排序
   从左向右依次扫描
   把雷达的位置放在最右点,如果某岛屿不在范围,就添加雷达
  
#include <iostream>
#include 
<math.h>
using namespace std;

const int MAXN=1001;
int n,d;
int sum;
double lefts[MAXN],rights[MAXN];
void qsort(int l,int r)
{
 
int ll=l,rr=r;
 
double mid=lefts[(l+r)/2];
 
while (ll<=rr)
 
{
       
while (lefts[ll]<mid) ll++;
       
while (lefts[rr]>mid) rr--;
       
if (ll<=rr)
       
{
        swap(lefts[ll],lefts[rr]);
        swap(rights[ll],rights[rr]);
        ll
++;
        rr
--;
       }

 }

 
if (ll<r) qsort(ll,r);
 
if (rr>l) qsort(l,rr);
}

void solve()
{
     
double std;
     qsort(
1,n);
     sum
=1;
     std
=rights[1];
     
for (int i=2;i<=n;i++)
     
{
         
if (lefts[i]>std)
         
{
          std
=rights[i];
          sum
++;
         }

         
else
         
{
             
if (rights[i]<std)
             
{
              std
=rights[i];
             }

         }

     }

}

int main()
{
    
int t=1;
    
while(1)
    
{
     cin
>>n>>d;
     
if (n==0&&d==0break;
     
int fail=0;
     
for (int i=1;i<=n;i++)
     
{
         
int x,y;
         cin
>>x>>y;
         
if (y>d)
         
{
                 fail
=1;
         }

         
else
         
{
             
double l=sqrt((double)(d*d-y*y));
             lefts[i]
=x-l;
             rights[i]
=x+l;
         }

     }

     
if (fail)
     
{
      cout
<<"Case "<<t++<<""<<-1<<endl;
     }

     
else
     
{
      solve();
      cout
<<"Case "<<t++<<""<<sum<<endl;
     }

    }

    
    
return 0;
}


posted on 2009-10-02 12:38 Vincent 阅读(152) 评论(0)  编辑 收藏 引用 所属分类: 数据结构与算法


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理