POJ 1328 贪心

来源:互联网 发布:西安公路研究院java 编辑:程序博客网 时间:2024/05/22 07:46
题意:海中有n个岛 有一种半径为d的雷达 求最少在岸边安几个雷达即可扫描到所有的岛

很简单的题,贪心算法

对每个小岛求出海边最右边能扫描到小岛的位置(p,0)

按p值对小岛排序

贪心 每次对最左边的未安置雷达的位置(p,0)安置雷达


#include<cstdio>#include<algorithm>#include<cmath>using namespace std;#define M 1005int n,id;double d;bool bans;struct Node{double x,y;double p;bool is_cover;bool operator < (const Node &a)const{return p<a.p;}void read(){scanf("%lf%lf",&x,&y);if(y>d){bans=false;}p=x+sqrt(d*d-y*y);is_cover=false;}}a[M];void read(){int i,x,y;for(i=0;i<n;i++){a[i].read();}sort(a,a+n);}void cal(){int ans=0;int i,j;for(i=0;i<n;i++){if(!a[i].is_cover){a[i].is_cover=true;ans++;for(j=i+1;j<n;j++){if(!a[j].is_cover){if( ( (a[j].x-a[i].p) * (a[j].x-a[i].p) + a[j].y*a[j].y ) <= d*d){a[j].is_cover=true;}}}}}printf("Case %d: %d\n",++id,ans);}int main(){id=0;while(~scanf("%d%lf",&n,&d)){bans=true;if(n==0&&d==0){break;}read();if(bans){    cal();}else{printf("Case %d: -1\n",++id);}}return 0;}


原创粉丝点击