参考:
https://blog.csdn.net/shuangde800/article/details/7828675
https://www.cnblogs.com/haoabcd2010/p/6171794.html?utm_source=itdadao&utm_medium=referral
1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 7 8 using namespace std; 9 10 struct node 11 { 12 double L; 13 double R; 14 }a[10010]; 15 16 bool cmp(node a, node b) 17 { 18 return a.R > b.R; 19 } 20 21 void sort_node(int n) 22 { 23 for (int i=0;i<n;i++) 24 { 25 int k=i; 26 for (int j=i+1;j<n;j++) 27 { 28 if (a[j].R>a[k].R) 29 k=j; 30 } 31 swap(a[k],a[i]); 32 } 33 } 34 35 int main() 36 { 37 int n; 38 double length, wide; // 都定义为double类型,因为使用勾股定理的时候肯定会算出小数 39 double center, radius; // center为圆心,radius为半径 40 double t; 41 while(scanf("%d%lf%lf", &n, &length, &wide) != EOF) 42 { 43 for(int i = 0; i < n; ++i) 44 { 45 cin >> center >> radius; 46 t = sqrt(radius*radius - (wide/2.0)*(wide/2.0)); 47 a[i].L = center - t; 48 a[i].R = center + t; 49 } 50 51 //sort(a, a+n, cmp); 快排不知道为什么不能AC 52 sort_node(n); 53 54 double border = 0; 55 int cnt = 0; 56 while(border < length) // 此类型题目的固定套路 57 { 58 int i; 59 for(i = 0; i < n; ++i) 60 { 61 if(a[i].L <= border && a[i].R > border) 62 { 63 border = a[i].R; 64 cnt++; 65 break; 66 } 67 } 68 69 if(i == n) // 如果i==n,说明遍历完了这n个区间,仍然没有找到符合条件的,即不能完全覆盖 70 break; 71 } 72 73 if(border < length) 74 cout << -1 << endl; 75 else 76 cout << cnt << endl; 77 } 78 79 return 0; 80 }