1 /* 2 题意:有n个点,用相同的线段去覆盖,当点在线段的端点才行,还有线段之间不相交 3 枚举+贪心:有坑点是两个点在同时一条线段的两个端点上,枚举两点之间的距离或者距离一半,尽量往左边放,否则往右边放, 4 判断一下,取最大值。这题二分的内容少 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <cmath> 10 using namespace std; 11 12 const int MAXN = 55; 13 const int INF = 0x3f3f3f3f; 14 double x[MAXN]; 15 int n; 16 17 bool check(double len) { 18 int last = -1; 19 for (int i=1; i<=n; ++i) { 20 if (i == 1 || i == n) continue; 21 if (last == -1) { 22 if (x[i] - len >= x[i-1]) { 23 last = -1; continue; 24 } 25 else if (x[i] + len <= x[i+1]) { 26 last = 1; continue; 27 } 28 else return false; 29 } 30 else if (last == 1) { 31 if (x[i-1] + len == x[i]) { 32 last = -1; continue; 33 } 34 else if (x[i] - len >= x[i-1] + len) { 35 last = -1; continue; 36 } 37 else if (x[i] + len <= x[i+1]) { 38 last = 1; continue; 39 } 40 else return false; 41 } 42 } 43 return true; 44 } 45 46 int main(void) { //HDOJ 4932 Miaomiao‘s Geometry 47 //freopen ("HDOJ_4932.in", "r", stdin); 48 49 int T; scanf ("%d", &T); 50 while (T--) { 51 scanf ("%d", &n); 52 for (int i=1; i<=n; ++i) { 53 scanf ("%lf", &x[i]); 54 } 55 sort (x+1, x+1+n); 56 57 double ans = 0.0; 58 for (int i=2; i<=n; ++i) { 59 if (check (x[i] - x[i-1])) ans = max (ans, x[i] - x[i-1]); 60 if (check ((x[i] - x[i-1]) * 0.5)) ans = max (ans, (x[i] - x[i-1]) * 0.5); 61 } 62 63 printf ("%.3f\n", ans); 64 } 65 66 return 0; 67 }
枚举+贪心 HDOJ 4932 Miaomiao's Geometry
时间: 2024-10-27 11:47:28