题目大意是在海岸线布置n个雷达,要求雷达的范围要包含所有的小岛;
思路:逆向思维把小岛看成一个个范围,与海岸线的交集,从最左端的开始找 (贪心最左端的点),接着不用一个一个去遍历,直接用前一个的右端点去替换下一个的左端点。。。。直至最后一个点。大致思想就是贪心,还是比较正常的题,适合刚学c语言的新生做(小白我就是一枚)。
下面是代码:
1 #include <iostream> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 struct node 7 { 8 double left,right; 9 }island[1001]; 10 bool cmp(node a,node b) 11 { 12 return a.left < b.left; 13 } 14 int main() 15 { 16 double x,y,d,temp; 17 int i,cnt,n,k=0; 18 bool flag; 19 while(scanf("%d%lf",&n,&d)&&!(n==0&&d==0)) 20 { 21 k++; 22 flag=false; 23 for(i=0; i<n; i++) 24 { 25 scanf("%lf%lf",&x,&y); 26 if(y > d||d<0) 27 { 28 flag = true; 29 } 30 island[i].right = x+sqrt(d*d-y*y);///岛屿右端点初始化 31 island[i].left = x-sqrt(d*d-y*y);///岛屿左端点初始化 32 } 33 if(flag) 34 { 35 printf("Case %d: -1\n",k); 36 continue; 37 } 38 sort(island,island+n,cmp); 39 temp=island[0].right; 40 cnt=1; 41 for(i=1; i<n; i++) 42 { 43 if(island[i].right <= temp) 44 { 45 temp = island[i].right;///岛屿右端点的替换 46 } 47 else if(island[i].left > temp) 48 { 49 cnt++; 50 temp = island[i].right; 51 } 52 } 53 printf("Case %d: %d\n",k,cnt); 54 } 55 return 0; 56 }
时间: 2024-10-13 02:08:04