您的位置:首页 > 其它

HDU—— 4932 Miaomiao's Geometry

2014-11-04 18:15 302 查看
题意:求最大长度的线段覆盖使得这样的长度区间能够覆盖所有所给的点,每次覆盖的点都必须在覆盖线段的两端。

解题思路:这样的长度最大为相邻两点之间的距离或者是相邻两点之间距离的一半,所以枚举出所有相邻点之间的距离,找出一个符合条件的即可。详见代码:

Code:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int T,N;
double dis[210],num[210];//dis[i]存储相邻两个点之间的距离值,num[i]存储每个点的坐标值
int solve(double len)
{
int flag = 0;//用来标记是否有用到右边段
for(int i= 1; i<N-1; i++)
{
if(!flag && num[i]-num[i-1] >= len) continue;//右边段没有被标记且len在左边段不是符合条件的最大距离
if(flag && num[i]-num[i-1] >= 2*len)//当右边段被标记且左边段距离值的一半符合条件,但不是最大
{
flag = 0; continue;//所以讲右边段从新标记,直到找到最大的线段值
}
if(num[i+1]-num[i] >= len)//当右边段没有被标记且右边段符合条件且不是最大值
{
if(num[i+1]-num[i] == len)//当右边段的距离值等于len
{
flag = 0; i++;//则右边段需从新标记且将该两点的距离跳过去,即不再该两点之间放线段
}
else flag = 1;//否则标记右边段
continue;
}
return 0;
}
return 1;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
int size = 0;//记录距离值的个数

for(int i = 0; i < N; i++)
scanf("%lf",&num[i]);
sort(num,num+N);//将每个点坐标排序
for(int j = 1; j < N; j++)
{
dis[size++] = num[j]-num[j-1];//记录相邻点之间的距离
dis[size++] = (num[j]-num[j-1])/2;//记录相邻点之间的距离的一半
}
sort(dis,dis+size);//对距离值排序
double ans = 0;//ans表示最大的线段值
for(int i = size-1; i >= 0; i--)
{
if(solve(dis[i])) { ans = dis[i];break;}//当遇见符合条件的距离值时直接跳出
}
printf("%.3lf\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: