zoukankan      html  css  js  c++  java
  • HDU 4932 贪心

    Miaomiao's Geometry

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


    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
     

    Recommend
    hujie   |   We have carefully selected several similar problems for you:  4934 4933 4931 4930 4929 
     

    简直奇妙,比赛的时候900多就21个过的...,自己当时没考虑到一条线段能覆盖两个点的情况,说究竟还是自己太弱了,不够细心,还有就是自己太心急了,刚敲完就交了,导致罚时比較多,今后得慢慢改,注意到答案仅仅能是距离或者距离的一半,依次枚举即可,对每一个点仅仅有两种选择,一种是选点左边的线段,一种是选右边的线段,当能选左边的时候一定要选左边的,否则选右边的,如果左右两边都不能选,那么这个线段肯定长了,如果当前枚举的距离为x,那么选左边的条件是A[j]-A[j-1]-vis[j]>=x||A[j]==A[j-1]+x,右边这样的就是一条线段覆盖两个点的情况,vis[j]是上一个点对如今这个区间的影响.

    代码例如以下:


    #include <iostream>
    #include <map>
    #include<algorithm>
    #include <stack>
    #include <string.h>
    #include <queue>
    #include<cstdio>
    using namespace std;
    #define INF  5e9+7
    typedef long long LL;
    int main()
    {
        //freopen("in.txt","r",stdin);
        long long T,N;
        double A[100];
        double vis[100];
        cin>>T;
        while(T--)
        {
            cin>>N;
            for(int i=1; i<=N; i++)cin>>A[i];
            sort(A+1,A+N+1);
            double ans=0;
            A[N+1]=INF;
            for(int i=1; i<=N-1; i++)
            {
                memset(vis,0,sizeof(vis));
                double x=A[i+1]-A[i];
                bool ok1=true,ok2=true;
                for(int j=2; j<=N-1; j++)
                {
                    if((A[j]-A[j-1]-vis[j]>=x)||(A[j]==A[j-1]+x))
                    {
                        continue;
                    }
                    if(A[j+1]-A[j]>=x)
                    {
                        vis[j+1]=x;
                        continue;
                    }
                    ok1=false;
                    break;
                }
                if(ok1)
                {
                    ans=max(x,ans);
                }
                memset(vis,0,sizeof(vis));
                for(int j=2; j<=N-1; j++)
                {
                    if(A[j]-A[j-1]-vis[j]>=x/2||A[j]==A[j-1]+x/2)
                    {
                        continue;
                    }
                    if(A[j+1]-A[j]>=x/2)
                    {
                        vis[j+1]=x/2;
                        continue;
                    }
                    ok2=false;
                    break;
                }
                if(ok2)ans=max(ans,x/2);
            }
            printf("%.3f
    ",ans);
        }
        return 0;
    }



  • 相关阅读:
    用node.js从零开始去写一个简单的爬虫
    如何在手机上查看测试vue-cli构建的项目
    【干货】听说你想成为一名6的飞起的黑客,这些资料怎么能少
    用node.js从零开始去写一个简单的爬虫
    如何在手机上查看测试vue-cli构建的项目
    一个好用的在线微信二维码设计网站
    ES6-----学习系列十五(Iterator)
    js学习总结----js中常用的四种输出方式
    js学习总结----javascript引入到页面的方式和细节
    ES6-----学习系列十四(promise)
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5058623.html
Copyright © 2011-2022 走看看