poj 1328 贪心

来源:互联网 发布:厦门公安局网络刻章 编辑:程序博客网 时间:2024/06/07 07:28


http://poj.org/problem?id=1328

题意:平面上有一些点,现要求用一些圆心在x轴上的圆(雷达)来覆盖这些点,问最少需要多少雷达。

把每个点的放置雷达的区间求出,然后按照区间排序。排好序后,从左至右看,当发现下一个区间的起始点大于前面所有区间的最小结束点的时候,答案加一。else 如果下一个区间的起始点小于等于的话,并且区间的终点也小于雷达所在的点,那么雷达所在的点更新为该区间的终点。   简单的贪心算法。。

把雷达所在的点放到所有区间的起始点或终点,是我感觉这道题

#include <cstdio>#include <iostream>#include <string.h>#include <stdlib.h>#include <fstream>#include <math.h>#include <algorithm>#define INF 0x3f3f3f3fusing namespace std;//const double PI = acos(-1.0); const int maxn=1005;int n;double d;struct point{double l;double r;}p[maxn];bool cmp(point  a,point  b){return a.l < b.l;}int main(){//ifstream cin("input.txt");int kase=0;while(cin>>n>>d,n){int ok=1;double x,y;for(int i=0;i<n;i++){cin>>x>>y;if(y>d) ok=0;double dx=sqrt(d*d-y*y);p[i].l=x-dx,p[i].r=x+dx;}if(ok==0) {printf("Case %d: -1\n",++kase);continue;}sort(p,p+n,cmp);int ans=1;double radar=p[0].r;for(int i=1;i<n ;i++){if(p[i].l>radar) ans++,radar=p[i].r;else {if(p[i].r<radar)  radar=p[i].r;}}printf("Case %d: %d\n",++kase,ans );}return 0;}

不太好想的地方,之后贪心的思路比较简单。

0 0