poj1328题

196K 0MS C++ 1352B

先求出以每个island为圆心时,与x轴的交点,得到覆盖该island的雷达坐标的变化范围,然后从左向右,按贪心策略,求各个变化范围的最多交集(即若相邻几个island在x轴有交集,则在此处安装一个雷达),最后所求交集的个数即为minimal number of radar installations

#include<stdio.h>
#include<math.h>
int a[1000],b[1000];
int sort(int m,int n)
{
 int start=m+1,end=n;
 int temp;
 while(1)
 {
  while(end!=m&&a[end]>=a[m])
   end--;
  while(a[start]<a[m]&&start<end)
   start++;
  if(end<=start)
  {
   temp=a[m];
   a[m]=a[end];
   a[end]=temp;
   temp=b[m];
   b[m]=b[end];
   b[end]=temp;
   return end;
  }
  else
  {
   temp=a[start];
   a[start]=a[end];
   a[end]=temp;
   temp=b[start];
   b[start]=b[end];
   b[end]=temp;
  }
 }
}
void qsort(int m,int n)
{
 if(m<n)
 {
  int q=sort(m,n);
  qsort(m,q-1);
  qsort(q+1,n);
 }
}
int main()
{
 int n,len,k;
 double l[1000],r[1000];
 scanf("%d %d",&n,&len);
 int count=0;
 while(n||len)
 {
  count++;
  for(int i=0;i<n;i++)
      scanf("%d %d",&a[i],&b[i]);
  qsort(0,n-1);
  double s=len*len;
  for(k=0;k<n;k++)
  {
   if(b[k]>len||b[k]<0)
    break;
   double temp;
   temp=sqrt(s-b[k]*b[k]);
   l[k]=a[k]-temp;
   r[k]=a[k]+temp;
  }
  if(k<n)
  {
   printf("Case %d: -1\n",count);
   scanf("%d %d",&n,&len);
   continue;
  }
  int min=1;
  double t=r[0];
  for(int j=1;j<n;j++)
  {
   if(t>=l[j])//若区域有交集,则继续向后移动
   {
    if(t>r[j])//注意该条件一定不能省略。
     t=r[j];//更新区域范围
    continue;
   }
   else
   {
    min++;//否则,须安装一个雷达,并在雷达的变化范围内最大限度地覆盖更多的island  

    t=r[j];
   }
  }
  printf("Case %d: %d\n",count,min);
  scanf("%d %d",&n,&len);
 }
 return 1;
}

原文地址:https://www.cnblogs.com/ltfbk/p/poj1328.html