天天看点

编程题-绕圈排队

题目

时间限制:1秒
空间限制:32768K
牛家庄幼儿园为庆祝61儿童节举办庆祝活动,庆祝活动中有一个节目是小朋友们围成一个圆圈跳舞。牛老师挑选出n个小朋友参与跳舞节目,已知每个小朋友的身高h_i。为了让舞蹈看起来和谐,牛老师需要让跳舞的圆圈队形中相邻小朋友的身高差的最大值最小,牛老师犯了难,希望你能帮帮他。
           

样例:

  • 当圆圈队伍按照100,98,103,105顺时针排列的时候最大身高差为5,其他排列不会得到更优的解

输入描述:

  • 输入包括两行,第一行为一个正整数n(3 ≤ n ≤ 20)
  • 第二行为n个整数h_i(80 ≤ h_i ≤ 140),表示每个小朋友的身高。

输出描述:

  • 输出一个整数,表示满足条件下的相邻小朋友身高差的最大值。

输入例子:

4
100 103 98 105
           

输出例子:

5
           

思路:

对身高进行排序,排序后间隔分成两排,第二排逆序和第一排合并。  
           
#include <iostream>
#include <list>
#include <vector>
using namespace std;

int cal_max_dif(list<int> &li)
{
    int dif=;
    list<int>::iterator it=li.begin();
    int num1=*it;
    li.push_back(num1);
    it++;
    for(;it!=li.end();it++)
    {
        int num2=*it;
        int tmp=num2-num1;
        num1=num2;
        tmp= tmp<? -tmp: tmp;
        if(tmp>dif)
            dif=tmp;
    }
    li.pop_back();
    return dif;
}


int main()
{
    int n=;
    cin>>n;
    int tmp;
    list<int> li;
    list<int> li1;
    list<int> li2;
    for(int i=;i<n;i++)
    {
        cin>>tmp;
        li.push_back(tmp);
    }
    li.sort();
    int num=;
    for(list<int>::iterator it=li.begin();it!=li.end();it++)
    {
        if(==num%)
            li1.push_back(*it);
        else
            li2.push_back(*it);
        num++;
    }
    li2.reverse();
    for(list<int>::iterator it=li1.begin();it!=li1.end();it++)
    {
        li2.push_back(*it);
    }      
    cout<<cal_max_dif(li2)<<endl;

    return ;
}