博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6、庆祝六一--全国模拟(四)
阅读量:4659 次
发布时间:2019-06-09

本文共 1104 字,大约阅读时间需要 3 分钟。

[编程题] 庆祝61
时间限制: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
解题思路:考虑我们已经将身高升序排序了,然后对于前k个小朋友组成队形的身高差的最大值的最小值为f(k),并且第k个和第(k-1)个小朋友是相邻的。现在我们加入第(k+1)个小朋友,考虑到第(k + 1)个小朋友身高是大于等于前面的小朋友,插入队形之后,第(k + 1)个小朋友一定与两个小朋友相邻, 所以当我们将第(k + 1)个小朋友插入到第k个和第(k - 1)个小朋友中间可以得到f(k + 1)的下界一定是max(f(k), h[k] - k[k - 2]),我们又注意到这样插入之后第(k + 1)个和第k个小朋友还是相邻的,于是这样可以一直推广下去。考虑最初3个小朋友的时候这样也是可行的, 于是问题变成了求max(h[i] - h[i - 2])。可以写出很简洁的代码。
1  #include 
2 3 using namespace std; 4 5 const int maxn = 20 + 5; 6 7 int n; 8 int h[maxn]; 9 int main() {10 scanf("%d", &n);11 for(int i = 0; i < n; i++) scanf("%d", &h[i]);12 sort(h, h + n);13 int ans = 0;14 for(int i = 2; i < n; i++) ans = max(ans, h[i] - h[i - 2]);15 cout << ans << endl;16 }

 

转载于:https://www.cnblogs.com/qqky/p/7064849.html

你可能感兴趣的文章
关于DateTime操作
查看>>
Android中控制Dialog呈现的时间
查看>>
Mac上面搭建web服务器
查看>>
jQuery类级别插件--返回顶部,底部,去到任何部位
查看>>
胡思乱想
查看>>
让Oracle 大小写敏感 表名 字段名 对像名
查看>>
1021. Deepest Root (25) -并查集判树 -BFS求深度
查看>>
男人二十岁后应该学会的习惯
查看>>
PHP学习 Session 学习
查看>>
ember.js:使用笔记5 使用view
查看>>
Java线程停止interrupt()方法
查看>>
使用SVN进行源码管理
查看>>
[转]asp:ScriptManager
查看>>
WC 2018/CTSC 2018/APIO 2018 游记
查看>>
CodeForces - 997C Sky Full of Stars
查看>>
多个线程访问url
查看>>
yum搭建 Linux+Nginx+Mysql+Tomcat(负载均衡,动静分离)
查看>>
HTML错误码
查看>>
泛型集合的五中遍历方式
查看>>
cocos2dx游戏开发——微信打飞机学习笔记(九)——BulletLayer的搭建
查看>>