POJ 1328 贪心、快排/求最少雷达数量
对于每个岛屿,计算出在区间[A,B]内必须有一个雷达,对这些区间的左坐标进行排序
第一个岛屿的右坐标为right,
初始雷达数量为1,对于第二个岛屿,如果它的右坐标比right小,则说明区间2包含了区间1,不用增加雷达数量,并设置right = 岛屿2的右坐标;
如果它的右坐标比right大,又岛屿2的左坐标大于right,则雷达数量+1,并设置right = 岛屿2的右坐标.
#include <algorithm> #include <math.h> #include <iostream> using namespace std; typedef struct island{ double l; double r; }Node; int qcmp( const void *arg1, const void *arg2 ) { return (((Node*)arg1)->l > ((Node*)arg2)->l)?1:-1; } int cmp( Node arg1, Node arg2 ) { return arg1.l< arg2.l; } int main(int argc, char* argv[]) { //freopen("d:/t.txt","r",stdin); int count; int r; int c = 0; while(cin>>count>>r&&(count||r)){ bool err = false; Node n[1000]; c++; for(int i=0;i<count;i++){ double x,y; cin>>x>>y; y=y<0?-y:y; if(y>r){ err = true; } double d = sqrt(r*r-y*y); n[i].l = x-d; n[i].r = x+d; } if(err) { printf("Case %d: -1\n",c); continue; } qsort(n,count,sizeof(n[0]),qcmp); //sort(n,n+count,cmp); int ans = 1; double left = n[0].r; for(int j=1;j<count;j++){ if(n[j].r<=left){ left = n[j].r; }else{ if(n[j].l>left){ans++;left = n[j].r;} } } printf("Case %d: %d\n",c,ans); } return 0; }
躲猫猫社团团长 http://t.sina.com.cn/coolria