• 每日编程-20170331


    题目:给定一个递增序列,a1 <a2 <...<an 。定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤i<n),现在要从a2 ,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小是多少?

    输入描述:

    第一行,一个正整数n(1<=n<=100),序列长度;接下来n个小于1000的正整数,表示一个递增序列。

    输出描述:

    输出答案。

    输入例子:

    5

    1 2 3 7 8

    输出例子:

    4

    解答:

    首尾不能删

    有ak, ak+1, ak+2处,如果删除ak+1,则(ak+2)-(ak)的间隔肯定变大了

    所以最大间隔只能不变或者增加

    所以,先检查每个ak与ak+2之间的差值(也就是改变后的数列的间隔),找到最小值D‘

    与当前的最大间隔D比较

    如果D'小于D,则可以获得一个D’的间隔,保留最大间隔D

    如果D‘大于D,则只能获得一个D’来代替D

    另外,牛客网这道题的用例太差了

    只要return当前最大间隔就能通过

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 int Max(int a, int b) { return a < b ? b : a; }
     5 int Min(int a, int b) { return a > b ? b : a; }
     6 int minDis(vector<int> input) {
     7     int answer = input[2] - input[0];
     8     for (auto i = 0; i < input.size() - 2; i++)
     9     {
    10         answer = Min(answer, input[i + 2] - input[i]);
    11     }
    12     int maxD = answer;
    13     for (auto i = 0; i < input.size() - 1; i++)
    14     {
    15         maxD = Max(maxD, input[i + 1] - input[i]);
    16     }
    17     return maxD;
    18 }
    19 int main() {
    20     int n;
    21     while (cin >> n)
    22     {    
    23         vector<int> v;
    24         int in;
    25         for (auto i = 0; i < n; i++)
    26         {
    27             cin >> in;
    28             v.push_back(in);
    29         }
    30         cout << minDis(v) << endl;
    31     }
    32 }
  • 相关阅读:
    成功的速度一定要大于父母老去的速度
    luogg_java学习_09_泛型_集合
    luogg_java学习_08_设计模式_API
    luogg_java学习_07_抽象类_接口_多态学习总结
    报表请求默认输出格式(html或者excel)设置
    XML报表开发基本过程
    rtf模板常用技巧
    xml模板提交请求submit_request
    XML基础知识
    HTML语言常用语法
  • 原文地址:https://www.cnblogs.com/linhaowei0389/p/6653793.html
Copyright © 2020-2023  润新知