您的位置:首页 > 其它

hdu4932 Miaomiao's Geometry

2015-10-31 18:23 246 查看
这是一道搜索题,我们很容易得到目标值的上下界,然后就只能枚举了。

就是将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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: