真想说句,“啥也不想说了!!!”,qsort函数排序,人家从零开始,我赋值偏要从‘1’开始,调了半天
1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include <cstdlib> 5 using namespace std; 6 const int MAXN = 10000 + 10; 7 8 #define FFF freopen("input.txt", "r", stdin) 9 10 struct Node 11 { 12 double x, y; 13 } node[MAXN]; 14 15 int cmp(const void *a, const void *b) 16 { 17 return (*(Node *)a).x > (*(Node *)b).x ? 1 : -1; 18 } 19 20 int main() 21 { 22 FFF; 23 int n; 24 double r; 25 int cas = 1; 26 while(scanf("%d %lf", &n, &r) != EOF && (n+r)) 27 { 28 bool tag = false; 29 for(int i = 0; i < n; ++i) 30 { 31 scanf("%lf %lf", &node[i].x, &node[i].y); 32 if(node[i].y > r) 33 { 34 tag = true; 35 } 36 } 37 if(tag) 38 { 39 printf("Case %d: ", cas++); 40 printf("-1 "); 41 continue; 42 } 43 ///给他进行排序,然后从一端进行扫描 44 qsort(node, n, sizeof(node[0]), cmp);///qsort人家是从下标为0,进行排序,以后注意!! 45 46 int sum = 1; 47 48 printf("Case %d: ", cas++); 49 50 double left[MAXN],righ[MAXN]; //求出每个小岛与坐标轴的交点 51 for(int i=0 ; i < n; i++) 52 { 53 left[i] = node[i].x - sqrt(r*r - node[i].y * node[i].y); 54 righ[i] = node[i].x + sqrt(r*r - node[i].y * node[i].y); 55 } 56 57 double temp = righ[0]; //将第一个雷达放置在第一个点与坐标轴的右交点 58 for(int i = 0; i < n-1; ++i) 59 { 60 if(left[i+1] > temp) //这种情况下,不论雷达怎么放置,两小岛都不能在同一雷达范围内,所以必须放置新的雷达 61 { 62 temp = righ[i+1]; 63 sum++; 64 } 65 else if(righ[i+1] < temp)//当在这种情况下,必须要将雷达所在的位置更新为新小岛与坐标轴的右边界,才能保证 66 { 67 temp = righ[i+1]; //雷达能够覆盖到这两个岛屿 68 } //在其他情况就,不用放置新的雷达,也不用更新雷达的坐标 69 } 70 printf("%d ", sum); 71 } 72 return 0; 73 }