zoukankan      html  css  js  c++  java
  • 每日编程-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 }
  • 相关阅读:
    逆向笔记
    后缀名验证
    hook 虚表
    findhex
    敏捷开发模式下如何划定测试范围
    通过数据库来看互联网系统架构演变
    论技术人的总结习惯
    08.基于IDEA+Spring+Maven搭建测试项目--Maven的配置文件settings.xml
    07.基于IDEA+Spring+Maven搭建测试项目--logback.xml配置
    06.基于IDEA+Spring+Maven搭建测试项目--dubbo-consumer.xml配置
  • 原文地址:https://www.cnblogs.com/linhaowei0389/p/6653793.html
Copyright © 2011-2022 走看看