zoukankan      html  css  js  c++  java
  • hdu4932 Miaomiao's Geometry (BestCoder Round #4 枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4932


    Miaomiao's Geometry

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 410    Accepted Submission(s): 147


    Problem Description
    There are N point on X-axis . Miaomiao would like to cover them ALL by using segments with same length.

    There are 2 limits:

    1.A point is convered if there is a segments T , the point is the left end or the right end of T.
    2.The length of the intersection of any two segments equals zero.

    For example , point 2 is convered by [2 , 4] and not convered by [1 , 3]. [1 , 2] and [2 , 3] are legal segments , [1 , 2] and [3 , 4] are legal segments , but [1 , 3] and [2 , 4] are not (the length of intersection doesn't equals zero), [1 , 3] and [3 , 4] are not(not the same length).

    Miaomiao wants to maximum the length of segements , please tell her the maximum length of segments.

    For your information , the point can't coincidently at the same position.
     
    Input
    There are several test cases.
    There is a number T ( T <= 50 ) on the first line which shows the number of test cases.
    For each test cases , there is a number N ( 3 <= N <= 50 ) on the first line.
    On the second line , there are N integers Ai (-1e9 <= Ai <= 1e9) shows the position of each point.
     
    Output
    For each test cases , output a real number shows the answser. Please output three digit after the decimal point.
     
    Sample Input
    3 3 1 2 3 3 1 2 4 4 1 9 100 10
     

    Sample Output
    1.000 2.000 8.000
    Hint
    For the first sample , a legal answer is [1,2] [2,3] so the length is 1. For the second sample , a legal answer is [-1,1] [2,4] so the answer is 2. For the thired sample , a legal answer is [-7,1] , [1,9] , [10,18] , [100,108] so the answer is 8.
     
    Source
     

    题意:

    求最大可以覆盖全部所给的点的区间长度(所给的点必须处于区间两端)。


    思路:

            答案一定是相邻点之间的差值或者是相邻点之间的差值除以2,那么把这些可能的答案先算出来。然后依次从最大的開始枚举进行验证就可以。


    代码例如以下:


    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    const int MAXN = 147;
    int f[MAXN];//记录线段方向
    double p[MAXN];
    double d[MAXN];//相邻断点的差值
    int n;
    void init()
    {
        memset(p,0,sizeof(p));
        memset(f,0,sizeof(f));
        memset(d,0,sizeof(d));
    }
    
    bool Judge(double tt)
    {
         int i;
        for(i = 1; i < n-1; i++)
        {
            if(p[i] - tt < p[i-1] && p[i] + tt > p[i+1])
                break;//不管向左还是向右均为不符合
            if(p[i] - tt >= p[i-1])//向左察看
            {
                if(f[i-1] == 2)//假设前一个是向右的
                {
                    if(p[i] - p[i-1] == tt)
                        f[i] = 1;//两个点作为线段的两个端点
                    else if(p[i] - p[i-1] >= 2*tt)//一个向左一个向右
                    {
                        f[i] = 1;
                    }
                    else if(p[i] + tt <= p[i+1])
                    {
                        f[i] = 2;//仅仅能向右
                    }
                    else
                        return false;
                }
                else
                    f[i] = 1;
            }
            else if(p[i] + tt <= p[i+1])
                f[i] = 2;
        }
        if(i == n-1)//所有符合
            return true;
        return false;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            init();
            scanf("%d",&n);
            for(int i = 0; i < n; i++)
            {
                scanf("%lf",&p[i]);
            }
            sort(p,p+n);
            int cont = 0;
            for(int i = 1; i < n; i++)
            {
                d[cont++] = p[i] - p[i-1];
                d[cont++] = (p[i] - p[i-1])/2.0;
            }
            sort(d,d+cont);
            double ans = 0;
            for(int i = cont-1; i >= 0; i--)
            {
                memset(f,0,sizeof(f));
                f[0] = 1; //開始肯定是让线段向左
                if(Judge(d[i]))
                {
                    ans = d[i];
                    break;
                }
            }
            printf("%.3lf
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    python中的编码问题
    CVPR2018 Tutorial 之 Visual Recognition and Beyond
    hdu 1376 Octal Fractions
    hdu 1329 Hanoi Tower Troubles Again!
    hdu 1309 Loansome Car Buyer
    hdu 1333 Smith Numbers
    hdu 1288 Hat's Tea
    hdu 1284 钱币兑换问题
    hdu 1275 两车追及或相遇问题
    hdu 1270 小希的数表
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6832346.html
Copyright © 2011-2022 走看看