题目
时间限制: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 ;
}