http://poj.org/problem?id=1328
//第一次:从左边第一个未被覆盖的island开始 -->>失败 因为还有y坐标这一因素 不能保证贪心
//第二次:找两个点 确定一个圆 ----->>>其实早就应该发现错误 漏洞百出 不具有普遍性
//从左边第一个未覆盖的点作为基点 找到第一个 y坐标>=的点(如果没有找到) 做这两个点的公共圆
//如果不能做这两个点的公共圆 或者 没有y>=的点 那么做这个圆的右极限圆
//更新覆盖的点
//蠢-->>
//最终策略:把注意力全部集中在x轴上 , 对每个island 作为圆心 交在x轴上有一个区间 那么radar在这个区间内都可以覆盖这个岛屿
//所以讲所有岛屿的左区间进行排序 区间重叠的共用一个radar
//思路一错 全盘否定
网上题解盗一张图说明
1 #include <iostream> 2 #include <stdio.h> 3 #include <stdio.h> 4 #include <algorithm> 5 #include <math.h> 6 using namespace std; 7 8 struct Island 9 { 10 int x,y; 11 double limit_l, limit_r; 12 bool cover; 13 bool operator < (Island a) const 14 { 15 return limit_l < a.limit_l;//按左区间排序 16 } 17 }island[1024]; 18 int N, d; 19 20 int solve() 21 { 22 double limit_l, limit_r; 23 int cnt = 1; 24 if (!N) return 0;//如果N==0 25 for (int i = 0; i < N; i++) 26 { 27 island[i].limit_l = island[i].x - sqrt( d*d - island[i].y*island[i].y ); 28 island[i].limit_r = island[i].x + sqrt( d*d - island[i].y*island[i].y ); 29 } 30 sort(island, island+N);//按照左区间排序 31 limit_l = island[0].limit_l;//这里最后忘了初始化 然后挂了 32 limit_r = island[0].limit_r; 33 for(int i = 1; i < N; i++) 34 { 35 //cnt++;//第一个雷达 36 if (island[i].limit_l > limit_r) 37 { 38 cnt++; 39 limit_l = island[i].limit_l; 40 limit_r = island[i].limit_r; 41 } 42 else if (island[i].limit_r < limit_r) 43 { 44 limit_r = island[i].limit_risland[i].x - sqrt( d*d island[i].y*island[i].y ); 45 } 46 } 47 return cnt; 48 } 49 int main() 50 { 51 freopen("in.txt", "r", stdin); 52 bool fail = false; 53 int Case = 0; 54 while (~scanf("%d%d",&N, &d)) 55 { 56 if (N == 0 && d == 0) break; 57 getchar();//空行 58 fail = false;//失败的标志 59 Case++; 60 for (int i = 0;i < N; i++) 61 { 62 scanf("%d%d", &island[i].x, &island[i].y); 63 if ( island[i].y > d || island[i].y < 0) 64 { 65 fail = true; 66 } 67 } 68 if (fail) printf("Case %d: %d\n",Case, -1); 69 else printf("Case %d: %d\n", Case, solve()); 70 } 71 return 0; 72 }
时间: 2024-10-04 17:33:40