【算法题】庆祝61

来源:互联网 发布:程序员年终工作汇报 编辑:程序博客网 时间:2024/06/06 03:45

牛家庄幼儿园为庆祝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


分析:
对小朋友按身高排序,
使用dp[i]表示前i个小朋友最优的排列身高差最大值

dp[i+1]=max(dp[i],array[i]array[i2])


#include <vector>#include <iostream>#include <string>#include <numeric>#include <hash_set>#include <algorithm>using namespace std;#define debug_int func(vector<int>& vec){    if (vec.size()<2)    {        return -1;    }    sort(vec.begin(), vec.end());    if (vec.size() == 2)    {        return vec[1] - vec[0];    }    int my_max(0);    for (auto i = 2;i<vec.size();++i)    {        my_max = max(vec[i] - vec[i - 2],my_max);    }    return my_max;}int main(){    int n;    vector<int> vec;#ifdef debug_    n = 4;    int array[4]{100,103,98,105};    vec.insert(vec.begin(),array,array+4);#else    cin>>n;    vec.resize(n);    for (auto i = 0;i<n;++i)    {        cin>>vec[i];    }#endif    cout<<func(vec);    return 0;}
原创粉丝点击