hdu4932 Miaomiao's Geometry
2015-10-31 18:23
246 查看
这是一道搜索题,我们很容易得到目标值的上下界,然后就只能枚举了。
就是将x轴上的点排序之后从左到右依次考察每个点,每个点要么在线段的左端点,要么在线段的右端点。
点编号从0到n-1,从编号为1的点开始,在枚举的过程中不断压缩上界,有一种情况需要特别讨论,即哪种一条线段恰好覆盖相邻两个点的。
View Code
就是将x轴上的点排序之后从左到右依次考察每个点,每个点要么在线段的左端点,要么在线段的右端点。
点编号从0到n-1,从编号为1的点开始,在枚举的过程中不断压缩上界,有一种情况需要特别讨论,即哪种一条线段恰好覆盖相邻两个点的。
#include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <string> #include <vector> #include <set> #include <cmath> #include <ctime> #pragma comment(linker, "/STACK:102400000,102400000") #define lson (u << 1) #define rson (u << 1 | 1) #define rep(i, a, b) for(i = a; i < b; i++) #define reps(i, a, b, c) for(i = a; i < b; i += c) #define repi(i, a, b) for(i = a; i >= b; i--) #define cls(i, j) memset(i, j, sizeof i) using namespace std; typedef __int64 ll; const double eps = 1e-6; const double pi = acos(-1.0); const int maxn = 1e5 + 10; const int maxm = 1050; const int inf = 0x3f3f3f3f; const ll linf = 0x3fffffffffffffff; const ll mod = 1e9 + 7; double a[55]; int n; double maxi, mini; double dfs(int u, int pre, double limit, int fixed){ //printf("%d %d\n",u, pre); if(u >= n - 1) return limit; if(limit <= mini) return mini; double to_left = a[u] - a[pre]; double to_right = a[u + 1] - a[u]; double tem; if(fixed){ if(to_left >= limit) return dfs(u + 1, u, limit, 1); if(to_right >= 2 * limit || to_right == limit) return dfs(u + 2, u + 1, limit, 1); if(to_right > limit) return dfs(u + 1, u + 1, limit, 1); if(to_right < limit) return mini; } if(to_left >= limit) return dfs(u + 1, u, limit, 0); double tem1 = dfs(u + 1, u, to_left, 0); double tem2 = mini; if(to_right >= 2 * limit) tem2 = dfs(u + 2, u + 1, limit, 0); else{ if(to_right <= limit) tem2 = dfs(u + 2, u + 1, to_right, 1); double tem3 = mini; if(limit >= to_right / 2) tem3 = dfs(u + 2, u + 1, to_right / 2, 0); tem2 = max(tem2, tem3); tem3 = dfs(u + 1, u + 1, min(to_right, limit), 0); tem3 = max(tem2, tem3); if(limit < to_right / 2) tem3 = dfs(u + 2, u + 1, limit, 0); tem2 = max(tem2, tem3); } return max(tem1, tem2); } int main(){ // freopen("in.txt", "r", stdin); int T; scanf("%d", &T); while(T--){ scanf("%d", &n); int i; rep(i, 0, n) scanf("%lf", &a[i]); sort(a, a + n); a = 0; mini = (double)linf; rep(i, 1, n) mini = min(mini, a[i] - a[i - 1]); maxi = (double)linf; rep(i, 1, n - 1) maxi = min(maxi, max(a[i + 1] - a[i], a[i] - a[i - 1])); double ans = dfs(1, 0, maxi, 0); printf("%.3f\n", ans); } return 0; }
View Code
相关文章推荐
- Test Markdown Editor
- [LeetCode] Bulls and Cows
- Android View视图层次
- 16道嵌入式c语言面试题
- 12. Xcode7 使用http
- java反射机制
- C++类和继承
- 事件扩展
- iOS基础面试题
- HDU 5512 Pagodas (gcd)
- 对sass通过compass进行编译
- 四、View的事件体系续
- nyoj+stack的简单使用
- Intellij idea13配置tomcat,并实现一个简单的servlet
- 类的静态成员
- 如何通过实现parcelable接口传递值对象
- WebBrowserControl
- SSH客户端(如PuTTY)ssh远程登录Linux非常慢的解决方法
- HDU1174(空间点到直线的距离,用叉积)
- nyoj+二分函数lower_bound+大数组的注意事项