zoukankan      html  css  js  c++  java
  • 6、庆祝六一--全国模拟(四)

    [编程题] 庆祝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 <bits/stdc++.h>
     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 }
  • 相关阅读:
    J2SE-反射
    c3p0 连接数据库失败的问题
    c# 调用存储过程
    存储过程使用truncate时
    Parcelable intent传递对象时,需要将该对象实现Parcelable 或者Serializable
    android intent 在打开设置activity的时候在监听事件的内部 适用setclass()方法时 不是直接适用this 关键字
    c# 读取appconfig文件
    Oracle 连接数据库的几种方式
    通过反射获得方法,和绑定事件
    js 验证
  • 原文地址:https://www.cnblogs.com/qqky/p/7064849.html
Copyright © 2011-2022 走看看