題目大意:給定幾個點,求用幾個雷達能覆蓋全部的點,輸入的點為坐標,雷達的半徑首先給定!
貪心求解:
#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; }