首页 > 代码库 > BestCoder4——Miaomiao's Geometry(水题。不知道放什么分类)

BestCoder4——Miaomiao's Geometry(水题。不知道放什么分类)

Miaomiao‘s Geometry


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


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.
 AC代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <map>
#include <algorithm>
#include <queue>
#include <cmath>

#define INF 0xffffff
#define lln long long

#ifdef ONLINE_JUDGE
#define FOI(file) 0
#define FOW(file) 0
#else
#define FOI(file) freopen(file,"r",stdin);
#define FOW(file) freopen(file,"w",stdout);
#endif

using namespace std;
struct Node
{
    int n;
    bool operator < (const Node &a) const
    {
        return n < a.n;
    }
};

int n;
#define MAXN 51

int a[MAXN];

int main()
{
    //FOI("input");
    //FOW("output");
    //write your programme here


    int i, j, k;
    int t, pre;
    int n, len;
    Node temp;
    priority_queue <Node> q;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        for(i = 0; i < n; i++)
            scanf("%d", &a[i]);

        sort(a, a+n);

        for(i = 0; i < n-1; i++)
        {
            len = a[i+1] - a[i];
            temp.n = len;
            q.push(temp);
        }

        pre = 0;
        bool done = false;
        while(!q.empty())
        {
            while(pre == q.top().n)
            {
                q.pop();
            }
            pre = q.top().n;
            q.pop();

            for(i = 1; i < n; i++)
            {
                if(a[i] - a[i-1] >= pre)
                {
                    done = true;
                    continue;
                }
                else
                {
                    if(i != 1 && i != n-1)
                    {
                        bool x = a[i-1] - a[i-2] >= pre;
                        bool y = a[i+1] - a[i] >= pre;
                        if(x && y)
                        {
                            done = true;
                            continue;
                        }
                        done = false;
                        break;
                    }
                    else
                    {
                        if(i == 1 && a[i+1] - a[i] >= pre)
                        {
                            done = true;
                            continue;
                        }
                        else if(i == n-1 && a[i-1] - a[i-2] >= pre)
                        {
                            done = true;
                            continue;
                        }
                        done = false;
                        break;
                    }
                }
            }
            if(done)
                break;
        }
        while(!q.empty())
            q.pop();
        double s = pre;
        printf("%.3f\n", s);
    }

    return 0;
}