poj1328 贪心算法

来源:互联网 发布:3dmax烘焙导入unity3d 编辑:程序博客网 时间:2024/06/04 23:21


原题目:http://poj.org/problem?id=1328


贪心策略:尽可能一个卫星可以覆盖更多的岛屿。



计算出所有岛屿的雷达所在的区间,得到一个区间数组。

我们将这个数组按照区间左部分进行排序,那么重叠部分就表明这些岛屿的雷达可以共用一个。从而计算出最终解。



#include<cstdio>#include<math.h>#include<cstring>int kase=0;const int maxn=1000+5;int main(){int n,d;int x,y;int num;int flag;float xl[maxn],xr[maxn],temp,R,L;while((scanf("%d %d",&n,&d))==2&&n&&d){flag=0;        num=0;        kase++;for(int i=0;i<n;i++){scanf("%d %d",&x,&y);if(y>d)flag=1;xl[i]=x-sqrt((float)d*d-y*y);xr[i]=x+sqrt((float)d*d-y*y);}/*for(int i=0;i<n;i++){printf("%f %f\n",xl[i],xr[i]);}printf("\n");*/for(int i=0;i<n-1;i++){for(int j=0;j<n-1-i;j++){if(xl[j]>xl[j+1]){                     temp=xl[j];                     xl[j]=xl[j+1];                     xl[j+1]=temp;                     temp=xr[j];                     xr[j]=xr[j+1];                     xr[j+1]=temp;}}}/*for(int i=0;i<n;i++){printf("%f %f\n",xl[i],xr[i]);}*/L=xl[0];R=xr[0];num=1;for(int i=1;i<n;i++){if(xl[i]<=R){if(xr[i]<R){R=xr[i];}}if(xl[i]>R){num++;R=xr[i];}}if(flag==1){printf("Case %d: -1\n",kase);}else{printf("Case %d: %d\n",kase,num);}getchar();}}


0 0
原创粉丝点击