HDU—— 4932 Miaomiao's Geometry

题意:求最大长度的线段覆盖使得这样的长度区间能够覆盖所有所给的点,每次覆盖的点都必须在覆盖线段的两端。

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

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);
   }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值