程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj1328

poj1328

編輯:C++入門知識

題目大意:給定幾個點,求用幾個雷達能覆蓋全部的點,輸入的點為坐標,雷達的半徑首先給定!

貪心求解:

 

 
 

#include<stdio.h>  
#include<math.h>  
double x[1005],y[1005]; 
double left[1005],right[1005]; 
double r; 
int n,flag,test; 
int main() 
{ 
    test=1; 
    while(scanf("%d%lf",&n,&r)!=EOF&&(n||r)) 
    { 
     
        int i,j,sum; 
        double  temp;  
        flag=0; 
        sum=1; 
        for(i=0;i<n;i++) 
        { 
            scanf("%lf%lf",&x[i],&y[i]); 
            if(y[i]>r) 
            { 
                flag=1; 
            }        
        } 
        if(flag==1) 
        { 
            printf("Case %d: -1\n",test++); 
            continue; 
        }     
        for(i=0;i<n-1;i++)   
            for(j=0;j<n-i-1;j++)   
                if(x[j]>x[j+1])   
                {   
                    temp=x[j];   
                    x[j]=x[j+1];   
                    x[j+1]=temp;   
                    temp=y[j];   
                    y[j]=y[j+1];   
                    y[j+1]=temp;   
                }     
        for(i=0;i<n;i++) 
        { 
            left[i]=x[i]-sqrt(r*r-y[i]*y[i]); 
            right[i]=x[i]+sqrt(r*r-y[i]*y[i]); 
        }  
        temp=right[0]; 
        for(i=0;i<n-1;i++) 
        { 
            if(left[i+1]>temp) 
            {    
               temp=right[i+1]; 
               sum++; 
            } 
            else  if(right[i+1]<temp) 
            { 
                temp=right[i+1]; 
            } 
        } 
      printf("Case %d: %d\n",test++,sum); 
    } 
    return 0; 
} 

#include<stdio.h>
#include<math.h>
double x[1005],y[1005];
double left[1005],right[1005];
double r;
int n,flag,test;
int main()
{
 test=1;
 while(scanf("%d%lf",&n,&r)!=EOF&&(n||r))
 {
 
  int i,j,sum;
  double  temp;
  flag=0;
  sum=1;
  for(i=0;i<n;i++)
  {
   scanf("%lf%lf",&x[i],&y[i]);
   if(y[i]>r)
   {
       flag=1;
   }    
  }
  if(flag==1)
  {
   printf("Case %d: -1\n",test++);
   continue;
  } 
        for(i=0;i<n-1;i++) 
            for(j=0;j<n-i-1;j++) 
                if(x[j]>x[j+1]) 
                { 
                    temp=x[j]; 
                    x[j]=x[j+1]; 
                    x[j+1]=temp; 
                    temp=y[j]; 
                    y[j]=y[j+1]; 
                    y[j+1]=temp; 
                }   
     for(i=0;i<n;i++)
  {
   left[i]=x[i]-sqrt(r*r-y[i]*y[i]);
   right[i]=x[i]+sqrt(r*r-y[i]*y[i]);
  }
     temp=right[0];
     for(i=0;i<n-1;i++)
     {
      if(left[i+1]>temp)
      { 
      temp=right[i+1];
         sum++;
      }
      else  if(right[i+1]<temp)
      {
       temp=right[i+1];
      }
     }
   printf("Case %d: %d\n",test++,sum);
 }
 return 0;
}

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved